検索語の空白に関係なく同じ検索結果を得るにはどうすればよいですか?

私はeコマースのウェブサイトの検索ボックスを作ろうとしています。

検索は次のように動作します

ユーザーが製品を検索すると、search値はsearchメソッドを使用してsearchResults.phpというファイルに送信されます。

$searchVal=$_POST['searchVal'];

そして、次のクエリによってproductという名前のテーブルからデータベース内で検索されます

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

結果は次のif条件によってajaxレスポンスとして返されます

if($searchResult){
 echo "result";

}
else{

 echo "No products found";     
  }

何よりも、すべて期待どおりにうまく動作します。

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

空白、単数、複数形に関わらず検索したい。どうやってやるの ?

0
@Sirko上記のコードはコードフローの一例に過ぎず、まもなく私の状況を説明しています。私がこのプロセスのために書いたコードは、実際には長く、サニタイズではいです:)あなたの提案に感謝します... +1
追加された 著者 Bala.C,
上のコードを@Bazzzは、状況のいくつかのアイデアを与えるための単なる例です。私の実際のコード変数では、クエリで使用される前に適切に消毒されています。御返答いただき有難うございます。 +1
追加された 著者 Bala.C,
SQLクエリを確実にチェックする必要があります。上記のコードはSQLインジェクションの招待状です。
追加された 著者 Sirko,
#searchValをSQLクエリに直接記述するため、アプリケーションにSQLインジェクションが開かれていることに注意してください。
追加された 著者 Bazzz,

4 答え

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

 $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";

醜くて非効率的なハックは、

 $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のサイト検索サービス)を使用するだけです。

2
追加された

ステップ1:先行スペースと渋滞スペースを削除する:

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

ステップ2:既存のスペースを '%'(これは LIKE の構文ではワイルドカードです)で置き換えます。

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

最初のステップは、 $ terms = explode( ''、$ query)をスペースで検索し、 'SELECT * FROM products like WHERE name LIKE' $ terms [1]。 '% "...'

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

もう1つのアクションは、次のような "エイリアス"テーブルを持つことだけです。

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

次に、検索クエリー内のすべての出現を、そのクエリーのためにデータベースに照会する前に、左のものと置き換えます。

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

1
追加された

PHPでtrim()を使うと、文字列の先頭と末尾の空白(または他の文字)を取り除くことができます

0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com