在 PDO 中实现 LIKE 查询

Posted

技术标签:

【中文标题】在 PDO 中实现 LIKE 查询【英文标题】:implement LIKE query in PDO 【发布时间】:2012-06-22 10:43:11 【问题描述】:

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

我有这个问题:

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

我检查了$var1$var2,它们都包含我要搜索的词,我的 PDO 工作正常,因为我的一些查询 SELECT INSERT 他们工作,只是我不熟悉LIKE 在 PDO 中。

没有返回结果。我的$query 语法正确吗?

【问题讨论】:

How do I create a PDO parameterized query with a LIKE statement?的可能重复 【参考方案1】:

您必须在$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"%' 的内容,因为准备好的语句在已引用的字符串中引用了您的值。

【讨论】:

+1 进行解释。但我认为没有办法查看生成的查询。有类似的东西吗? 我这辈子都想不通,我已经忘记了这一切。很棒的答案。谢谢! 如果我的参数是“$name%”并且用户输入:$name = '%bob' 会发生什么。这不会产生锚定搜索而不是左锚定搜索的意外副作用吗?我将如何防止这种情况发生?【参考方案2】:

只需使用以下内容:

$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))  ... 

【讨论】:

这比将 % 直接添加到绑定变量要慢。【参考方案3】:

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

LIKE ?

在变量中:%string%

【讨论】:

嗯,对不起,但我不太确定如何实施您刚才的建议。 我在使用移动设备,但我会尽力解释。查看我的编辑。【参考方案4】:
$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?";
$params = array("%$var1%", "%$var2%");
$stmt = $handle->prepare($query);
$stmt->execute($params);

【讨论】:

【参考方案5】:

你可以看下面的例子

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

希望它会起作用。

【讨论】:

以上是关于在 PDO 中实现 LIKE 查询的主要内容,如果未能解决你的问题,请参考以下文章

在 bindParam 中使用 LIKE 进行 MySQL PDO 查询

使用 PDO 准备语句从搜索字段中使用多个关键字进行 LIKE 查询

PHP PDO 准备语句——MySQL LIKE 查询

怎样基于Redis实现模糊查询

PHP PostgreSQL PDO 无法使用 LIKE 绑定参数

django查询中的sql“LIKE”等价物