2016-12-07 3 views
0

私はこのコードを持っています: 'などをクエリ文字列から取得し、ユーザーをuri(szukaj/query)を検索するようにリダイレクトします。たとえばfilm_nameがRaj:wiaraで、ユーザーがraj:wiaraを検索すると、クエリはraj wiaraのようになり、ユーザーは結果を取得しません。私は単一の言葉に質問を爆発させることを考えていましたが、その後foreach wordはdbからSELECTをしますが、同じ映画の複数の結果が得られます。 javascriptコードを変更したくないので、次のような特殊文字なしではその映画名を作ることはできないと思います。 または、film_keywordsのdbに別の列を作成し、そこにムービーのすべての単語を区切って追加してからこの列を検索しますか?PHP検索MySQLの

+0

ここではどのようなフレームワークを使用していますか? '$ query'のようなものにプレースホルダ値を使用していないのはなぜですか?直接クエリ文字列に置くことは非常に危険です。 – tadman

答えて

2

MySQLの全文検索の機能は、ここではあなたの友達です:

http://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html

は試合のシリーズを返し、あなたがベストマッチのために返すように、スコアが得られます。


警告:$this->db->where("film_name LIKE '%$query%'");はSQLインジェクションが可能です。誰でもJavaScriptを巡回することができますので、入力サーバー側を常にクリーンアップする必要があります。これは、文字をストリッピングするだけでなく、DB関数を使って行うのが最善です。これを行うには、使用しているライブラリを確認してください。

+0

私は 'SELECT * FROM' films'をしました。マッチ(film_name)AGAINST( '+ Raj' BOOLEAN MODE) ' そして一致するものは返しませんでした。 – buli

+0

私はPHPを使用しています。テーブルを選択すると、 'フルテキスト'をクリックして 'ALTER TABLE' films' ADD FULLTEXT( 'film_name'); ' – buli

+0

を検索しますか?Raj:wiaraを検索すると、一致するものが返されます。しかし、「raj」または「raj:」だけをタイプすると、それはしません。 – buli

1

this answerのソリューションを使用すると、実際にあなたの文字列を爆発させることができます。

function searchMovie($query) 
    { 
     $queries = preg_split('/[^a-z0-9.\']+/i', $query); 
     foreach ($queries as $keyword){ 
      $this->db->where("film_name LIKE '%$keyword%'"); 
     } 

     $movies = $this->db->get ("films", 40); 
     if($this->db->count > 0) 
     { 
      return $movies; 
     } 
     return false; 
    } 

これは、結果はフィルタリングされますので、あなたのデシベルのために複数のAND条件を作成します。

+0

助けてくれてありがとう!良いかもしれませんが、私は全文回答を使用します、それは検索スコアなどを実装しています...それは私に合っています:)とにかくありがとう! – buli