2012-02-06 8 views
0

私は電子商取引のウェブサイトの検索ボックスを作ろうとしています。検索語の空白に関係なく同じ検索結果を得るには?

検索が製品の

た場合、ユーザー検索を次のように、検索値がアヤックス

$searchVal=$_POST['searchVal']; 

そしてそのビーイングを経由してPOSTメソッドを使用してsearchResults.phpという名前のファイルに送られている作品次のクエリ

$searchResult = mysql_query("SELECT * FROM products WHERE name LIKE '$searchVal'") 

によって製品という名前の表からデータベースで検索条件場合の結果は、以下のようにAjaxの応答として返送されますすべてすべて上記

if($searchResult){ 
echo "result"; 

} 
else{ 

echo "No products found";  
    } 

予想通り正常に動作します。

ユーザが携帯電話を探していて、携帯電話を入力していると仮定できます。しかし、私たちはカテゴリの携帯電話のみの製品を持ち、携帯電話の製品はありません。それで、携帯電話のレコードが存在するにもかかわらず、製品が見つかりませんでした。

空白に関係なく、単数形または複数形に検索したいと思っています。どうやってやるの ?

+2

SQLクエリーを確実にチェックする必要があります。上記のコードはSQLインジェクションの招待状です。 – Sirko

+1

#searchValをSQLクエリに直接記述するため、アプリケーションにSQLインジェクションが開かれていることに注意してください。 – Bazzz

+0

@Sirko上記のコードはコードフローの一例に過ぎず、まもなく私の状況を説明しています。私がこのプロセスのために書いたコードは、実際には長く、はいです。衛生措置であなたの提案に感謝します... +1 –

答えて

2

検索エンジンを実装する正しい方法は、表示されるレコードへの単語とリンクの別のテーブルを維持することです。

$qry="SELECT p.*, COUNT(*) 
    FROM products p 
    INNER JOIN srchwords s 
    ON p.id=s.product_id "; 
$searchVals=explode(' ',$_POST['searchVal']); 
foreach ($searchvals as $k=>$s) { 
    $searchvals[$k]="'" . mysql_real_escape_string(trim($s)) . "'"; 
} 
$qry.="WHERE s.word IN (" . implode(",",$searchvals) . ") ORDER BY COUNT(*) DESC"; 

醜いとinnefficientハックは次のようになります。

$qry="SELECT p.* 
    FROM products p"; 
$join=" WHERE " 

$searchVals=explode(' ',$_POST['searchVal']); 
foreach ($searchvals as $k=>$s) { 
    $qry.=$join . " p.desc LIKE '%" . mysql_real_escape_string(trim($s)) . "%' 
    $join=' OR '; 
} 

どちらの方法はまだ(ちょうどSの除去、Sで終わる単語のための追加の比較を追加)複数形に応じるないではありません。また、文字列をクリーンアップして複数のスペースと句読点を削除する必要があります(/^[a-z0-9]/i)。

または、よく書かれた既製の検索エンジンソリューション(mnogoエンジンやGoogleのサイト検索サービスなど)の1つを使用してください。

0

あなたは、文字列の先頭と末尾から空白(もしくは他の文字)を取り除くためにPHPでトリムを()を使用することができます

1

ステップ1:

$searchResult = mysql_query("SELECT * FROM products WHERE name LIKE trim('$searchVal')") 

ステップ2:先頭とtraillingスペースを削除:最初のステップは、()、スペース上の検索用語を爆発するだろう

$searchResult = mysql_query("SELECT * FROM products WHERE name LIKE str_replace(trim('$searchVal'), ' ', '%'") 
1

::「%」(LIKE構文でそれのワイルドカード)によって、既存のスペースを置き換える$terms = explode(' ', $query)を入力し、'SELECT * FROM products WHERE name LIKE "%'.$terms[0].'%" AND name LIKE "%'.$terms[1].'%" ...'を入力します。

もちろん、これは実際には複数の問題を解決するものではありません。また、非常に、非常にです。MySQLはワイルドカードで始まるLIKEクエリでインデックスを使用できないためです。

cellphone | cell phone 
cellphone | cell phones 
cellphone | cellphones 
... 

次にあなたが前に左側の1で、検索クエリ内のすべての回出てくる置き換えます:

行動のもう一つのコースは、次のようになり、「エイリアス」のテーブルを持っているだけですることができそれをデータベースに照会します。

インデックステーブルを使用するのが3番目によく、最も複雑な方法です。あなたは自分でそれを書いてはいけませんが、そこには素晴らしい解決策がいくつかあると思います。個人的には、Doctrine、which has this feature built inを使用しています。

関連する問題