2012-11-03 49 views
0

網站用戶使用搜索表單來查詢產品數據庫。輸入的關鍵字搜索數據庫中產品的標題。使用PDO準備的語句在搜索字段中使用多個關鍵字LIKE查詢

public function startSearch($keywords){ 
     $keywords = preg_split('/[\s]+/', $keywords); 
     $totalKeywords = count($keywords); 

     foreach($keywords as $key => $keyword){ 
      $search .= '%'.$keyword.'%'; 
      if($key != ($totalKeywords)-1){ 
       $search .= ' AND itemTitle LIKE '; 
      } 
     } 
$sql=$this->db->prepare("SELECT * FROM prodsTable WHERE itemTitle LIKE ?"); 
$sql->bindParam(1, $search);   
$sql->execute(); 
$sql->fetchALL(PDO::FETCH_ASSOC); 

如果用戶輸入單個關鍵字,搜索將起作用,但如果使用多個關鍵字,則查詢不會執行。如果: $ keywords ='apple ipod'; $ search ='%apple%AND itemTitle LIKE%ipod%';

所以準備的語句應該是這樣的:

「SELECT * FROM prodsTable WHERE itemTitle LIKE%蘋果%和itemTitle LIKE%的ipod%」

沒有結果返回時,兩款產品應該返回兼具「蘋果「和」iPod「。

我在做什麼錯?

+0

' 「SELECT * FROM prodsTable WHERE itemTitle LIKE '%蘋果%' AND itemTitle LIKE '%的ipod%'」'。你喜歡引用模式嗎? – Reflective

+0

在foreach語句中它是'%'。$ keyword。'%'它返回準備好的語句: SELECT * FROM prodsTable WHERE itemTitle LIKE%apple% 這很有效。但是,當添加第二個或第三個關鍵字時,$ search變量變爲: '%'。$ keyword。'%'AND itemTitle LIKE - >給出準備好的語句: SELECT * FROM prodsTable WHERE itemTitle LIKE%蘋果%和itemTitle LIKE%ipod% 不起作用。添加多個關鍵字不會提供結果。 我試過它:itemTitle LIKE'%aple%',但那也行不通。我的原始準備沒有引號的作品。 –

+0

'bindParam'將根據需要添加引號,因此它的確定 – Reflective

回答

3

準備語句保護你免受sql注入,所以參數中的sql代碼將不會被解釋。在調用prepare()之前,您將不得不建立一個正確數量爲AND itemTitle LIKE ?的sql查詢。

$keywords = preg_split('/[\s]+/', $keywords); 
    $totalKeywords = count($keywords); 
    $query = "SELECT * FROM prodsTable WHERE itemTitle LIKE ?"; 

    for($i=1 ; $i < $totalKeywords; $i++){ 
    $query .= " AND itemTitle LIKE ? "; 
    } 

    $sql=$this->db->prepare($query); 
    foreach($keywords as $key => $keyword){ 
    $sql->bindParam($key+1, '%'.$keyword.'%'); 
    } 
    $sql->execute(); 
+0

謝謝!我不得不做出以下更改,因爲它不會讓我通過引用傳遞。 \t \t的foreach($關鍵字作爲$密鑰=> $關鍵字){ \t \t \t $搜索= '%' $關鍵字 '%'。; \t \t \t $ sql-> bindParam($ key + 1,$ search); \t \t} 非常感謝您的幫助,我也很感謝您的解釋。 –

相關問題