2013-11-28 6 views
6

तरह% का उपयोग कर क्वेरी को खोजने मैं अपने CakePHP अनुप्रयोग के लिए निम्नलिखित खोज क्वेरी है: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 . '%' 
     ) 
    ) 
); 

कौन सा एक पैरामीटर $q बुलाया दोनों शीर्षक और सामग्री पर क्वेरी की तरह करने के लिए ले जाता है। खोज 'lorem'

यह यह ठीक मिलेगा लिए

Title: Lorem ipsum Content: Lorem ipsum dolare

और:

इसलिए उदाहरण के लिए अगर मैं निम्नलिखित है। लेकिन अगर मैं 'lorem dolare' की खोज करता हूं तो इसे नहीं मिलेगा।

मैं यह कैसे कर सकता हूं?

नोट: अगर मैं प्रतिलिपि प्राप्त होगा इस काम का उपयोग करें: मैं किसी भी प्लग आदि

संपादित करें का उपयोग नहीं करना चाहते हैं?

$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)' 
     ) 
    ) 
); 

संपादित करें 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

यह नहीं मिल रहा फिर भी दूर करने के लिए पहले '%' –

+0

@ फ्रेड-द्वितीय की कोशिश करो। – Cameron

+0

मैं सोच रहा था कि वेन ने 'FULLTEXT' खोज के नीचे क्या पोस्ट किया था। SO पर इस क्यू एंड ए पर एक नज़र डालें 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)" 
    ) 
) 

);

दूसरे शब्दों में, उद्धरण

साथ खोज मापदंड लगा

संपादित 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

यह भी एक बिल्कुल अच्छा एसक्यूएल इंजेक्शन भेद्यता है! ;) कृपया उचित [** सरणी वाक्यविन्यास **] (http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions) का उपयोग करें: '" MATCH (Post.title) के खिलाफ (? बुलेन मोड में) "=> $ q' @ कैमरॉन – ndm

+0

@ndm क्या आप वास्तव में पोस्ट कर सकते हैं जो आपको लगता है कि पूरी चीज कैसी दिखनी चाहिए? धन्यवाद – Cameron

1

जैसा आप यहां मदद नहीं करेगा। आपका शीर्षक Lorem ipsum है और आपकी सामग्री Lorem ipsum dolare है। आप lorem dolare खोज रहे हैं, जो LIKE ऑपरेटर के माध्यम से नहीं मिलेगा क्योंकि यह उन स्तंभों में से किसी एक के अंदर एक सबस्ट्रिंग नहीं है। आपको FULLTEXT का उपयोग करने की आवश्यकता होगी या आपको Sphinx जैसे कुछ उपयोग करने की आवश्यकता होगी। यदि आप यह पता लगाने की कोशिश कर रहे हैं कि कौन सा समाधान लागू करना है, तो this answer here पर एक नज़र डालें।

+0

तब आप क्या सुझाव देंगे? – Cameron

+0

@ कैमरेन ने मेरा जवाब अपडेट किया। –

+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."%" 
     ) 
    ) 
);