2011-05-18 36 views
0

我試圖建立這個準備好的聲明:PHP mysqli的準備語句中使用通配符

$sql = "SELECT * FROM entries WHERE"; 
$sql .= " title LIKE ? OR title LIKE ? OR title LIKE ? OR title LIKE ?"; 
$sql .= " OR content LIKE ? OR content LIKE ? OR content LIKE ? OR content LIKE ?"; 

$q = $this->db->prepare($sql); 

$one = $this->term; 
$two = "%" . $this->term; 
$three = $this->term . "%"; 
$four = "%" . $this->term . "%"; 

$q->bind_param("ssssssss", $one, $two, $three, $four, $one, $two, $three, $four); 
$q->execute(); 

$這個 - > db是我的mysqli連接對象

$這個 - >項爲用戶提供的字符串。

我沒有收到任何類型的錯誤,如從數據庫中。我知道sql語句有效,我使用$ this-> db-> query()來運行它,並且它很好。當我用準備好的語句運行它時,它會返回而沒有結果。有什麼建議麼?

+0

爲什麼所有的測試尋找「某事」,「%做某事」,「做某事%」或'%sth%'?這將產生與僅查找'%sth%'相同的結果,因此您可以將查詢保留爲'SELECT * FROM entries'WHERE title LIKE'%sth%'或內容LIKE'%sth%'' – 2011-05-18 07:52:35

+0

Carlos:謝謝你指出這一點。我查看了一些關於通配符搜索的文檔,它確實匹配任何內容(包括零匹配)。謝謝。 – John 2011-05-19 13:26:26

回答

0

我無法讓它與準備好的聲明一起工作。我轉向了mysqli-> query()並轉義了用戶字符串。卡洛斯,謝謝你幫我解決我的問題。

1

要在準備語句中使用通配符,您需要在sql語句中使用CONCAT。數據庫將負責將百分號連接到搜索詞上。

假設你想在開頭或搜索期末通配符,你的SQL應該像:

$sql = "SELECT * FROM entries WHERE title LIKE CONCAT('%', ?, '%') OR content LIKE CONCAT('%', ?, '%')"; 
+0

你*可以*但你不必。可以在PHP上添加通配符,就像OP一樣 – 2013-09-09 16:13:50