2013-11-28 4 views
6

のような%を使用してクエリを見つけるI私のCakePHPのアプリに対して次の検索クエリを持っている:タイトルと内容の両方のクエリのようにやって$qと呼ばれるパラメータを取りCakePHPは%

$this->paginate = array(
'limit'=>5, 
'order'=>'Note.datetime DESC', 
'conditions' => array(
    'Note.status'=>1, 
    'OR' => array(
     'Note.title LIKE' => '%'. $q . '%', 
     'Note.content LIKE' => '%'. $q . '%' 
     ) 
    ) 
); 

。例えばので

私は、次のしている場合:

Title: Lorem ipsum Content: Lorem ipsum dolare

そして'lorem'

の検索それは罰金それを見つけるだろう。しかし、私が'lorem dolare'を検索すると、それは見つからないでしょう。

どうすればよいですか?

注:私はFULLTEXTだろうこの作品を使用する場合:私はすべてのプラグインなど

EDITを使用したくありませんか?

$this->paginate = array(
'limit'=>5, 
'order'=>'Note.datetime DESC', 
'conditions' => array(
    'Note.status'=>1, 
    'OR' => array(
     'MATCH(Note.title) AGAINST('.$q.' IN BOOLEAN MODE)', 
     'MATCH(Note.content) AGAINST('.$q.' IN BOOLEAN MODE)' 
     ) 
    ) 
); 

EDIT 2:

上記しようとして、このエラーを取得:

Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dolor IN BOOLEAN MODE)) OR (MATCH(`Note`.`content`) AGAINST(lorem dolor IN BOOLE' at line 1 

SQL Query: SELECT `Note`.`id`, `Note`.`title`, `Note`.`excerpt`, `Note`.`content`, `Note`.`datetime`, `Note`.`user_id`, `Note`.`slug`, `Note`.`status`, `Note`.`topic_id`, `User`.`id`, `User`.`email`, `User`.`firstname`, `User`.`lastname`, `User`.`password`, `User`.`status`, `Topic`.`id`, `Topic`.`title`, `Topic`.`slug` FROM `db52704_driz2013`.`notes` AS `Note` LEFT JOIN `db52704_driz2013`.`users` AS `User` ON (`Note`.`user_id` = `User`.`id`) LEFT JOIN `db52704_driz2013`.`topics` AS `Topic` ON (`Note`.`topic_id` = `Topic`.`id`) WHERE `Note`.`status` = 1 AND ((MATCH(`Note`.`title`) AGAINST(lorem dolor IN BOOLEAN MODE)) OR (MATCH(`Note`.`content`) AGAINST(lorem dolor IN BOOLEAN MODE))) ORDER BY `Note`.`datetime` DESC LIMIT 5 
+0

はそれを見つけていないそれでもフレッド-II- @最初の '%' –

+0

を削除してください。 – Cameron

+0

Wayneが 'FULLTEXT'検索の下に投稿したものだけを考えていました。それで、このQ&Aをご覧くださいhttp://stackoverflow.com/q/17294924/1415724助けるかもしれません。 –

答えて

6

試してみてください。この

$this->paginate = array(
    'limit'=>5, 
    'order'=>'Note.datetime DESC', 
    'conditions' => array(
    'Note.status'=>1, 
    'OR' => array(
     "MATCH(Note.title) AGAINST('".$q."' IN BOOLEAN MODE)", 
     "MATCH(Note.content) AGAINST('".$q."' IN BOOLEAN MODE)" 
    ) 
) 

)。言い換えれば

、引用符で検索条件を囲む

EDITのNDMの提案は意味

$this->paginate = array(
    'limit'=>5, 
    'order'=>'Note.datetime DESC', 
    'conditions' => array(
    'Note.status'=>1, 
    'OR' => array(
     'MATCH(Note.title) AGAINST(? IN BOOLEAN MODE)' => $q, 
     'MATCH(Note.content) AGAINST(? IN BOOLEAN MODE)' => $q 
    ) 
) 

)を行います。

+0

ブーム:)完璧に動作します。ありがとう – Cameron

+2

それは完全に素晴らしいSQLインジェクションの脆弱性です! ;)代わりに適切な[**配列構文**](http://book.cakephp.org/2.0/ja/models/retrieving-your-data.html#complex-find-conditions)を使用してください: '' MATCH (Post.title)反対(BOOLEANモードで) "=> $ q' @ Camamer – ndm

+0

@ndmあなたは、全体が見えると思うものを正確に投稿できますか?ありがとう – Cameron

1

LIKEはここであなたを助けにはなりません。あなたのタイトルはLorem ipsumで、内容はLorem ipsum dolareです。 lorem dolareを検索していますが、これはLIKE演算子では検出されません。これは、これらの列のいずれかの部分文字列ではないためです。 FULLTEXTを使用するか、Sphinxのようなものを使用する必要があります。実装するソリューションを見つけようとしている場合は、this answer hereをご覧ください。

+0

あなたはそれから何を提案しますか? – Cameron

+0

@Cameron私の答えを更新しました。 –

+0

例を共有できますか?私はこれを見つけました:http://stackoverflow.com/questions/10827444/cakephp-fulltext-search-mysql-with-rating私は何をしたいのですか? – Cameron

4

また、これを試すことができます。

$this->paginate = array(
    'limit'=>5, 
    'order'=>'Note.datetime DESC', 
    'conditions' => array(
     'Note.status'=>1, 
     'OR' => array(
      'Note.title LIKE' => "%$q%", 
      'Note.content LIKE' => "%$q%" 
     ) 
    ) 
); 
0
Please Try this: 

$this->paginate = array(
    'limit'=>5, 
    'order'=>'Note.datetime DESC', 
    'conditions' => array(
     'Note.status'=>1, 
     'OR' => array(
      'Note.title LIKE' => "%".$q."%", 
      'Note.content LIKE' => "%".$q."%" 
     ) 
    ) 
);