在 PDO 中实现 LIKE 查询

implement LIKE query in PDO

提问人:Leandro Garcia 提问时间:6/20/2012 最后编辑:CœurLeandro Garcia 更新时间:9/22/2017 访问量:57092

问:

我在 PDO 中实现 LIKE 时遇到了问题

我有这个疑问:

$query = "SELECT * FROM tbl WHERE address LIKE '%?%' OR address LIKE '%?%'";
$params = array($var1, $var2);
$stmt = $handle->prepare($query);
$stmt->execute($params);

我检查了它们,它们包含我想要搜索的两个单词,我的 PDO 工作正常,因为我的一些查询它们有效,只是我在 PDO 中不熟悉。$var1$var2SELECTINSERTLIKE

结果为 none。我的语法正确吗?$query

php mysql pdo 类 sql

答:

5赞 Madara's Ghost 6/20/2012 #1

不,您不需要引用 prepare 占位符。此外,在变量中包含 % 标记。

LIKE ?

在变量中:%string%

评论

0赞 Leandro Garcia 6/20/2012
嗯,对不起,但我不太确定如何实施你刚才的建议。
0赞 Madara's Ghost 6/20/2012
我在手机上,但我会尽力解释。请参阅我的编辑。
96赞 Carlos Campderrós 6/20/2012 #2

您必须将符号包含在 中,而不是包含在查询中:%$params

$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?";
$params = array("%$var1%", "%$var2%");
$stmt = $handle->prepare($query);
$stmt->execute($params);

如果在前面的代码中查看生成的查询,则会看到类似 的内容,因为预准备语句在已引用的字符串中引用了您的值。SELECT * FROM tbl WHERE address LIKE '%"foo"%' OR address LIKE '%"bar"%'

评论

0赞 Vignesh 7/28/2015
+1 解释..但我认为没有办法查看生成的查询..有这样的事情吗?
0赞 b3tac0d3 12/19/2015
我一辈子都想不通,我已经忘记了这一切。很棒的答案。谢谢!
2赞 danielson317 7/5/2018
如果我的参数是“$name%”,并且用户输入:$name = '%bob',会发生什么情况。这难道不会产生锚定搜索而不是左锚搜索的意外副作用吗?我该如何防止这种情况发生?
4赞 Miqdad Ali 6/20/2012 #3
$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?";
$params = array("%$var1%", "%$var2%");
$stmt = $handle->prepare($query);
$stmt->execute($params);
2赞 Dinesh Goyal 6/20/2012 #4

您可以看到下面的示例

$title = 'PHP%';
$author = 'Bobi%';
// query
$sql = "SELECT * FROM books WHERE title like ? AND author like ? ";
$q = $conn->prepare($sql);
$q->execute(array($title,$author));

希望它能起作用。

8赞 Grant 7/4/2017 #5

只需使用以下命令:

$query = "SELECT * FROM tbl WHERE address LIKE CONCAT('%', :var1, '%')
            OR address LIKE CONCAT('%', :var2, '%')";

$ar_val = array(':var1'=>$var1, ':var2'=>$var2);
if($sqlprep->execute($ar_val)) { ... }

评论

1赞 CristiC 1/21/2018
这比将 % 直接添加到绑定变量要慢。