2016-12-07 83 views
0

我有這樣的代碼:PHP MySQL的搜索

function searchMovie($query) 
    { 
     $this->db->where("film_name LIKE '%$query%'"); 
     $movies = $this->db->get ("films", 40); 
     if($this->db->count > 0) 
     { 
      return $movies; 
     } 
     return false; 
    } 

Javascript代碼從我提交表單按鈕條所有特殊字符,如; :'/等查詢字符串,然後重定向用戶搜索uri(szukaj/query)。例如,如果film_name是Raj:wiara,並且用戶搜索raj:wiara,則查詢看起來像是raj wiara,而用戶不會得到任何結果。我正在考慮將查詢分解爲單個單詞,然後用foreach單詞做一個來自數據庫的SELECT,但它會給出同一部電影的多個結果。不想更改javascript代碼,我想我不能在沒有特殊字符的情況下製作這些電影名稱。 或者,也許可以在數據庫中爲film_keywords創建另一列,然後添加電影的所有單詞,或者其他內容,然後搜索此列?

+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

我沒有'返回任何匹配 – buli

+0

我使用PHP我的管理'電影'匹配(電影名稱)反對('+ Raj'布爾模式)。當我選擇表格時,是否點擊'全文'到'ALTER TABLE'電影'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