2011-05-18 122 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