How do I create a PDO parameterized query with a LIKE statement?
这是我的尝试:
1 2 3 4 5 6 7 8
| $query = $database->prepare('SELECT * FROM table WHERE column LIKE"?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
} |
我发布后马上想通了:
1 2 3 4 5 6 7
| $query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));
while ($results = $query->fetch())
{
echo $results['column'];
} |
-
@Andrew:如果使用多个like怎么办? execute数组应如何按顺序执行?
-
谢谢。在csharp + Mysql + ODBC中也有类似的问题,就像它不会使用" select * from table where column?%?%;"的形式返回任何行;但是,如果我愿意的话,您会选择"从表中的*列中选择*吗?"。并将参数字符串设置为:string frag = $"%{searchFragment}%";然后使用frag作为参数值。奇怪的
-
PDO应该在执行调用中转义该%。 Kaqais的答案更好
-
似乎值得注意的是,PDOStatement :: bindParam文档页面上由用户提供的最高注释提供了另一种方法:在绑定变量之前将百分号添加到变量。
-
看一下Gavins解决方案,该解决方案取自该线程底部附近的"您的常识"页面。简单。逻辑上。
对于那些使用命名参数的人,以下是对MySQL数据库使用LIKE和%部分匹配的方法:
1
| WHERE column_name LIKE CONCAT('%', :dangerousstring, '%') |
其中命名参数为:dangerousstring。
换句话说,在您自己的查询中使用显式未转义的%符号,这些符号是分开的,并且绝对不是用户输入。
编辑:Oracle数据库的串联语法使用串联运算符:||,因此它将简单地变为:
1
| WHERE column_name LIKE '%' || :dangerousstring || '%' |
但是,有一些警告,如@bobince在这里提到的那样:
The
difficulty
comes when you want to allow a literal % or _ character in the
search string, without having it act as a wildcard.
因此,在将like和parameterization结合使用时,还需要注意其他事项。
-
+1-这对我来说似乎是一种好方法,因为所有串联都发生在替换占位符之后的数据库中,这意味着可以使用命名的占位符。值得一提的是,以上语法是针对Oracle的-在MySQL中,语法为LIKE CONCAT(%, :something, %)。参考:stackoverflow.com/a/661207/201648
-
这并不完全适合我,但可以让我走上正确的道路。我必须像%这样的东西才能工作。
-
我知道这是题外话,但即使使用此语句也可以执行sql注入,为什么?
-
这对我没有用,我还用SQL命令SELECT * FROM calculation WHERE ( email LIKE % || luza || % OR siteLocation LIKE %|| luza ||% OR company LIKE % ||luza ||% )测试了它,这会给我错误。
-
@AaronNewton and it means named placeholders can be used。当您在PHP中进行连接时,命名占位符怎么回事?显然,PHP中的级联支持命名和位置,并且更可移植,因为您可以对任何数据库使用相同的查询。我真的不明白为什么这么多人认为命名占位符和位置占位符之间有什么区别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| $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 />\
";
}
}
else
{
echo 'Nothing found';
} |
-
与公认的答案相比,使用它有什么优势吗?使用bindValue是否可以防止注入攻击?接受的答案基本上像过去一样,通过将搜索字符串连接到%来否定使用?占位符的值。
-
在$ query-> rowCount()== 0之前使用否定的意义是什么?这真的有意义吗?
您也可以尝试这个。我面临类似的问题,但经过研究取得了结果。
1 2 3 4 5 6 7 8 9
| $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); |
-
我编辑了您的帖子,以将代码放入代码块中-您可以在stackoverflow.com/help/formatting上阅读有关帖子格式的更多信息。其他一些用户选择对您的答案进行不合格投票而不发表评论,因此我不确定造成不合格的原因。
-
再说一遍,我没有对你的问题投票。别人不赞成。
这有效:
1
| search `table` where `column` like concat('%', :column, '%') |
我是从php妄想中得到的
1 2 3 4
| $search ="%$search%";
$stmt = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll(); |
它对我有用,非常简单。就像他说的那样,在将其发送到查询之前,您必须"首先准备我们完整的文字"
PDO会转义"%"(可能导致sql注入):如果希望访问部分字符串,则使用先前的代码会产生期望的结果,但如果访问者键入字符"%",即使您不输入,也会获得结果t数据库中没有存储任何内容(可能导致sql注入)
我尝试了很多变化,所有这些都具有相同的结果,PDO转义了"%"导致不需要的/未激活的搜索结果。
我很值得分享,如果有人发现它周围的单词,请分享
-
这是来自手册:us3.php.net/manual/en/pdo.prepared-statements.php这是有关该主题的另一篇文章:stackoverflow.com/questions/22030451/我真的很想知道您对此的看法发行
-
可能的解决方案(未经测试)使用CONCAT,例如:$ sql ="从条目WHERE的item_title中选择条目item_title喜欢CONCAT('%',?,'%')"参考:blog.mclaughlinsoftware.com/2010/02/21/php-binding-a-wildcar d
-
PDO无法逃脱%。它是您的代码做错了。对于解决方案,应该阅读这里已经提供的答案。
-
感谢您的建议。 无论如何,测试的代码是手册中的代码,使用占位符来避免SQL注入,我仍然得到相同的结果。示例#6无效使用占位符PDO使用上述代码(而不是我的代码)逃逸了%。 对论坛来说,我是新手,所以我可能不了解这里的评论,发布和声誉流程的工作方式,我下次会牢记这一点,因为基于上一个评论,您需要声誉来帮助他人或发表评论。 谢谢。