Answers:
我发布后马上想通了:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));
while ($results = $query->fetch())
{
echo $results['column'];
}
对于使用命名参数的用户,以下是如何LIKE
与MySQL数据库的%
部分匹配一起使用:
WHERE column_name LIKE CONCAT('%',:dangerousstring,'%')
其中命名参数为:dangerousstring
。
换句话说,%
在您自己的查询中使用显式未转义的符号,这些符号是分开的,并且绝对不是用户输入。
编辑:Oracle数据库的串联语法使用串联运算符:||
,因此它将简单地变为:
WHERE column_name喜欢'%'|| :dangerousstring || '%'
但是,有一些警告,如@bobince 在这里提到的那样:
在 困难 来的时候,你要允许文字
%
或_
搜索字符串中的字符,而不用它作为通配符。
因此,在将like和parameterization结合使用时,还需要注意其他事项。
LIKE CONCAT('%', :something, '%')
。参考:stackoverflow.com/a/661207/201648
SELECT * FROM calculation WHERE ( email LIKE '%' || luza || '%' OR siteLocation LIKE '%'|| luza ||'%' OR company LIKE '%' ||luza ||'%' )
这会给我错误。
and it means named placeholders can be used
。当您在PHP中串联时,命名占位符怎么回事?显然,PHP中的级联支持命名和位置,并且更便于移植,因为您可以对任何数据库使用相同的查询。我真的不明白为什么这么多人认为命名占位符和位置占位符之间有什么区别。
$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';
}
bindValue
可以防止注入攻击吗?公认的答案基本上是?
通过将搜索字符串串联起来,否定使用占位符的价值%
。
您也可以尝试这个。我面临类似的问题,但经过研究取得了结果。
$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);
PDO会转义“%”(可能导致sql注入):如果希望访问部分字符串,则使用先前的代码会产生期望的结果,但如果访问者键入字符“%”,即使您不输入,也会获得结果t数据库中没有存储任何内容(可能导致sql注入)
我已经尝试了很多变体,所有这些都具有相同的结果,PDO转义了“%”导致不需要的/未激活的搜索结果。
我很值得分享,如果有人发现它周围的单词,请分享
like
怎么办?execute数组应如何按顺序执行?