2012-10-17 12 views
5

我正在嘗試使用PDO準備語句編寫關鍵字搜索。理想情況下,我想利用LIKE運算符在字段值內搜索一個子字符串。這裏是我的代碼:使用帶%的LIKE運算符用PDO預準備語句進行關鍵字搜索

$statement = $this->db->prepare("select * from whatever where title like ? or author like ?"); 
$statement->execute(array("%$titleKeyword%","%$authorKeyword%")); 
$rows = $statement->fetchAll(PDO::FETCH_ASSOC); 

不幸的是,當我嘗試這樣做時,$ rows總是空的。但是,如果我將SQL複製到phpMyAdmin中,並將每個「%keyword%」替換爲?符號,它工作正常(當使用關鍵字時,我會得到結果)。

我也曾嘗試下面的代碼:

$statement = $this->db->prepare("select * from whatever where title like :titleKeyword or author like :authorKeyword"); 
$statement->bindValue(":titleKeyword", '%'.$titleKeyword.'%', PDO::PARAM_STR); 
$statement->bindValue(":authorKeyword", '%'.$authorKeyword.'%', PDO::PARAM_STR); 
$statement->execute(); 
$rows = $statement->fetchAll(PDO::FETCH_ASSOC); 

我在那你應該綁定參數時,而不是在SQL本身(事先準備好的聲明中)以包括%另一個問題看,但那不起作用。

我可以求助於直接插入關鍵字到SQL(做一些消毒後),但我想堅持準備好的語句。任何幫助將不勝感激。

+1

剛剛做了一個快速的模擬和工作正常(PHP 5.3.5)〜你一定要在綁定值時添加'%'。也許問題與您的$ titleKeyword&$ authorKeyword? – TerryProbert

+0

不幸的是,沒有。我在這裏發佈之前檢查過這些內容。 – Randy

回答

3

這實際上對我的作品:

$stmt = $pdo->prepare("select * from t where c like ?"); 
$stmt->execute(array("70%")); 
print_r($stmt->fetchAll()); 

你用什麼版本的PHP?

+0

我正在使用5.3.1。甚至一些關於PDOStatement的PHP文檔的評論建議使用這兩種方法之一。 – Randy

+1

仔細檢查你的變量$ titleKeyword和$ authorKeyword(使用'''var_dump'''!) – steffen

+0

已經完成(這是一個版本,我修改變量之前和之後有%調用bindValue之前): string (6)「%iPod%」 string(6)「%iPod%」 – Randy

2

感謝Steffen和Terry的幫助。

我最終通過切換到bindParam()而不是bindValue()來解決問題。我不知道爲什麼我不能用bindValue()來做到這一點,但現在我太累了,無法照顧。

+0

很高興你知道Randy!進一步閱讀; http://stackoverflow.com/questions/1179874/pdo-bindparam-versus-bindvalue – TerryProbert