在PDO中实现LIKE查询

Lea*_*cia 37 php mysql pdo sql-like

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

我有这个问题:

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

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

结果是没有返回.我$query的语法是否正确?

Car*_*rós 76

您必须%$params,而不是在查询中包含标志:

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

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

  • 如果我的参数是“$name%”并且用户输入:$name = '%bob',会发生什么。这不会产生锚定搜索而不是左锚定搜索的意外副作用吗?我该如何防止这种情况发生? (2认同)

Gra*_*ant 6

只需使用以下内容:

$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)) { ... }
Run Code Online (Sandbox Code Playgroud)


Mad*_*iha 5

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

LIKE ?
Run Code Online (Sandbox Code Playgroud)

在变量中: %string%