2013-02-20 118 views
0

我已經使用了Google,並閱讀了很多關於如何使用PDO在mysql中創建搜索的內容,但是我仍然沒有成功嘗試爲自己創建一個搜索。PHP PDO LIKE語句不成功

我在我的表中的兩個字段中搜索相同的一組關鍵字。

$str = explode(' ','app ban'); 
$p_id = 5; 
$search_term = ''; 
$stmt = $db->prepare('SELECT id from the_table WHERE p_id=:p_id AND (name LIKE :search_term1 OR text LIKE :search_term2)'); 
$stmt->bindValue(':p_id',$p_id, PDO::PARAM_INT); 
$stmt->bindValue(':search_term1',$search_term, PDO::PARAM_STR); 
$stmt->bindValue(':search_term2',$search_term, PDO::PARAM_STR); 
foreach($str as $key => $value) 
{ 
    $search_term = '%'.$value.'%'; 
    $stmt->execute(); 
    while($row = $stmt->fetchObject()) 
    { 
     if(!isset($res[$row->id])) 
      $res[$row->id] = 0; 
     $res[$row->id] = $res[$row->id] + 1*strlen($value); 
    } 
} 
print_r($res); 

這使得即使我的琴絃「應用程序」和「禁令」在這兩個名稱和文本幾個領域一個空的結果。當我在phpmyadmin中進行相同的搜索時,我得到了很多結果。

我嘗試在關鍵字周圍添加一些引號:''%'。$ value'%'';沒有成功。 我覺得我沒有選擇。請幫忙!

+0

你知道你可以重新使用命名參數佔位符嗎? – Phil 2013-02-20 23:47:55

回答

2

上面的兩個答案對於bindValue是正確的 - 它在執行時只解析一次該值。您可以使用bindParam,它在 - > execute()發生時解析。

爲每PHP bindParam manual page

綁定一個PHP變量在SQL語句中的對應的命名或問號佔位符,用於準備語句。與PDOStatement :: bindValue()不同,該變量綁定爲引用,並且僅在調用PDOStatement :: execute()時進行評估。

+0

啊哈!這就是bindValue和bindParam之間的區別。大!這種理解幫助我很多。謝謝! – Juniperus 2013-02-21 07:20:56

1

好吧你定義了$ search_term ='';爲空字符串,然後您使用bindValue並使用具有空字符串值的相同變量。

在循環中,你想分配

$search_term = '%' . $value . '%'; 

但它已經被束縛,因此你不能修改它。移動你的

$stmt->bindValue(':search_term1',$search_term, PDO::PARAM_STR); 
$stmt->bindValue(':search_term2',$search_term, PDO::PARAM_STR); 

foreach循環內

$search_term = '%' . $value . '%'; 
+0

感謝您的回答。它是我正在尋找的bindParam。 – Juniperus 2013-02-21 20:42:59

0
  1. 您設置$search_term爲空字符串
  2. 您綁定兩個搜索條件爲空字符串後
  3. 你然後進入一個循環,重新設置值$search_term,但不重新綁定。
  4. 然後,由於某種原因,您執行查詢並檢索結果,同時仍在#3的循環內。
+0

感謝您的評論。我正在尋找的是將參數綁定到查詢,以便每次更改參數的值時都不需要綁定值。我這樣做是因爲我想單獨搜索搜索字符串中的每個單詞並讀取循環內的結果。我將$ search_term設置爲空白,因爲我認爲你必須在綁定它之前聲明參數,這似乎是不必要的。再次感謝! – Juniperus 2013-02-21 20:42:14