如何使用LIKE语句创建PDO参数化查询?

And*_*son 100 php pdo

这是我的尝试:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');

$query->execute(array('value'));

while ($results = $query->fetch()) 
{
    echo $results['column'];
}
Run Code Online (Sandbox Code Playgroud)

And*_*son 121

我发布后立即想出来:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));

while ($results = $query->fetch())
{
    echo $results['column'];
}
Run Code Online (Sandbox Code Playgroud)

  • PDO应该在执行调用中转义该%.卡凯的答案更好 (2认同)

Kzq*_*qai 74

要使用与%部分匹配的Like,您还可以执行此操作:column like concat('%', :dangerousstring, '%')使用命名参数:dangerousstring.换句话说,在您自己的查询中明确使用未转义的%符号,这些符号是分开的,绝对不是用户输入.

编辑:我发现的另一种连接语法是使用连接运算符:||,所以它将变得简单: where column like '%' || :dangerousstring || '%' etc

@bobince 在这里提到:

困难 来的时候,你要允许文字%_搜索字符串中的字符,而不用它作为通配符.

因此,在组合like和参数化时需要注意的其他事项.

  • +1 - 这对我来说似乎是一个很好的方法,因为在占位符被替换之后,所有的连接都发生在数据库中,这意味着可以使用命名的占位符.值得一提的是上面的语法适用于Oracle - 在MySQL中语法是`LIKE CONCAT('%',:something,'%')`.参考:http://stackoverflow.com/a/661207/201648 (5认同)
  • 我知道这是题外话,但我什至可以使用这个语句来执行 sql 注入,为什么? (2认同)

Bla*_*zer 17

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->bindValue(1, "%$value%", PDO::PARAM_STR);
$query->execute();

if (!$query->rowCount() == 0) 
{
    while ($results = $query->fetch()) 
    {
        echo $results['column'] . "<br />\n";
    }       
} 
else 
{
    echo 'Nothing found';
}
Run Code Online (Sandbox Code Playgroud)


Vij*_*mar 12

你也可以试试这个.我面临类似的问题,但研究后得到了结果.

$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search');

$stmt= $pdo_connection->prepare($query);

$stmt->execute(array(':search' => '%'.$search_term.'%'));

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($result);
Run Code Online (Sandbox Code Playgroud)

  • 重复一遍,我没有就你的问题投票; 其他人贬低了. (2认同)

kjd*_*n84 5

这有效:

search `table` where `column` like concat('%', :column, '%')
Run Code Online (Sandbox Code Playgroud)