44

我在 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 中不熟悉。

结果没有返回。my$query在语法上是否正确?

4

5 回答 5

90

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

于 2012-06-20T10:06:14.260 回答
8

只需使用以下内容:

$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)) { ... }
于 2017-07-03T21:01:27.047 回答
6

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

LIKE ?

在变量中:%string%

于 2012-06-20T10:04:34.307 回答
4
$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?";
$params = array("%$var1%", "%$var2%");
$stmt = $handle->prepare($query);
$stmt->execute($params);
于 2012-06-20T10:06:27.970 回答
2

你可以看到下面的例子

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

希望它会奏效。

于 2012-06-20T10:12:35.113 回答