私は4テーブル:企業、都市、カテゴリ、サブカテゴリがあります。ここではそれらのそれぞれの構造を行く:
企業:PHP/SQLの簡易検索エンジン
company_name (varchar) NOT NULL
company_city_id (int) FOREIGN KEY NOT NULL
company_category_id (int) FOREIGN KEY NOT NULL
company_subcategory_id (int) FOREIGN KEY
company_description (varchar)
都市:
city_name (varchar)
city_id (int)
カテゴリ:
category_name (varchar)
category_id (varchar)
のサブカテゴリ:今
subcategory_name (varchar)
subcategory_id (varchar)
が、これによると、私はいくつかの検索用語を使用して企業テーブルで検索を実行します。検索した単語が、選択した都市のcompany_name、category_name、subcategory_nameまたはcompany_descriptionに存在する値と一致するか、部分的に一致する会社を表示し、関連性に従って結果を並べる必要があります。検索キーワードの上位に一致する会社。たとえば、私はこれで試しています:
$city = 1;
$search_term = "pizza company";
$sql = "SELECT * FROM companies comp, categories cat, subcategories sub WHERE comp.company_city_id = :city AND
comp.company_name OR cat.category_name OR sub.subcategory_name OR comp.company_description LIKE '%:search_term%'";
$query = $conexao->prepare($sql);
$query->execute(array
(
'city' => $city,
'search_term' => $search_term
));
しかし、これはうまく動作していないようです。私はいくつかの繰り返しの結果を持っています。もし私が言葉の順序を逆にすると、結果は現れません。カテゴリ名を検索しても効果がないようです。私が期待した結果を得るためにはどうすればよいですか?
** WARNING **:これは、いくつかの深刻な[SQLインジェクションのバグ]を持っている(http://bobby-tables.com/)ユーザデータがクエリ内で使用されているので。可能な限り**準備文**を使用してください。これらは[mysqli](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)と[PDO](http://php.net/manual/)で行うのはかなり簡単です。 en/pdo.prepared-statements.php)ここでユーザが提供するデータは '? 'または':name'のインジケータで指定され、後で 'bind_param'や' execute'を使ってデータを入力します。 ** '$ _POST'、' $ _GET'、または任意のユーザーデータを直接クエリに入れないでください。 – tadman
これは動作しません。プレースホルダはありません。生の変数をクエリに注入しています – Akintunde007
そのような 'OR'節を組み合わせることはできません。それぞれの条件を指定する必要があります(ちょっと退屈ですが、そのようなものです) –