2017-10-26 15 views
0

私は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 
)); 

しかし、これはうまく動作していないようです。私はいくつかの繰り返しの結果を持っています。もし私が言葉の順序を逆にすると、結果は現れません。カテゴリ名を検索しても効果がないようです。私が期待した結果を得るためにはどうすればよいですか?

+0

** 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

+0

これは動作しません。プレースホルダはありません。生の変数をクエリに注入しています – Akintunde007

+1

そのような 'OR'節を組み合わせることはできません。それぞれの条件を指定する必要があります(ちょっと退屈ですが、そのようなものです) –

答えて

1

は、このことを考慮してください。

$sql = "SELECT * FROM companies comp, categories cat, subcategories sub WHERE 
comp.company_city_id = {$city} AND 
comp.company_name LIKE '%{$search_term}%' OR cat.category_name LIKE '% 
{$search_term}%' OR sub.subcategory_name LIKE '%{$search_term}%' OR 
comp.company_description LIKE '%{$search_term}%'"; 
+0

これは機能しません。検索結果と一致しない結果と結果が繰り返し表示されています。 – Hypister