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

Php 如何使用LIKE语句创建PDO参数化查询?,php,pdo,Php,Pdo,以下是我的尝试: $query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"'); $query->execute(array('value')); while ($results = $query->fetch()) { echo $results['column']; } 在我发布了以下内容后,我马上想到了: $query = $database->prepare('S

以下是我的尝试:

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

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

while ($results = $query->fetch()) 
{
    echo $results['column'];
}

在我发布了以下内容后,我马上想到了:

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

while ($results = $query->fetch())
{
    echo $results['column'];
}

对于那些使用命名参数的用户,下面介绍了如何将
%
类似的
MySQL数据库的部分匹配一起使用:
WHERE column_name LIKE CONCAT('%', :dangerousstring, '%')
然而,@bobince提到了一些警告:

当您希望在 搜索字符串,而不将其用作通配符

因此,在组合like和参数化时,还需要注意其他一些问题。

$query=$database->prepare('SELECT*FROM table WHERE column like?');
$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';
}
$query->bindValue(1,“%$value%”,PDO::PARAM_STR); $query->execute(); 如果(!$query->rowCount()==0) { 而($results=$query->fetch()) { echo$results['column']。“
\n”; } } 其他的 { 回声“什么也没找到”; }
您也可以试试这个。我面临着类似的问题,但经过研究得到了结果

$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注入):在查找匹配部分字符串时,使用前面的代码将得到所需的结果,但是如果访问者键入字符“%”,即使数据库中没有存储任何内容,您仍然会得到结果(可能导致sql注入)

我尝试了很多变化,所有这些都是相同的结果,PDO正在转义“%”,导致不需要的/未引用的搜索结果

我认为这是值得分享的,如果有人在它周围发现了一个词,请分享它

这很有效:

search `table` where `column` like concat('%', :column, '%')
这是我从你那里得到的


这对我来说很有效,很简单。正如他所说,在发送到查询之前,您必须“先准备好完整的文本”

我也有类似的需求,但使用的是从表单中获取的变量。我这样做是为了使用PHP从PostgreSQL数据库中获得结果:

<?php
     $player = $_POST['search'];  //variable from my search form
     $find = $sqlPDO->prepare("SELECT player FROM salaries WHERE player ILIKE ?;");
     $find->execute(['%'.$player.'%']);

     while ($row = $find->fetch()) {
         echo $row['player']."</br>";
     }
?>



“ILIKE”使搜索不区分大小写,因此对cart或cart或cart的搜索都将返回相同的结果。

@Andrew:如果使用了多个类似的
怎么办?执行数组应该如何按顺序执行?谢谢。csharp+Mysql+ODBC使用like也有类似的问题,它不会使用“select*from table where column like”%”返回任何行,但如果我像您那样执行“select*from table where column like?”;并将参数字符串设置为:string frag=$“%{searchFragment}%”;然后使用frag作为参数值。WeirdPDO应该在execute调用中转义该%。Kaqai的答案是betterIt似乎值得注意的是,顶部提供了一种不同的方法:在绑定变量之前向变量添加百分号。请看一下gavin的解决方案,该解决方案摘自您的常识页面,位于该线程底部附近。简单。逻辑。+1-对我来说,这似乎是一个很好的方法,因为所有的连接都发生在替换占位符后的数据库中,这意味着可以使用命名占位符。值得一提的是,上面的语法是针对Oracle的——在MySQL中,语法是
像CONCAT(“%”,:something,“%”)
。参考资料:这对我来说并不奏效,但让我走上了正确的轨道。我必须像“%”一样做一些“%”的事情才能让它工作。我知道这是离题的,但我甚至可以用这个语句来实现sql注入,为什么?这对我不起作用,我还用sql命令
SELECT*FROM calculation WHERE测试了它(类似“%”的电子邮件或类似“%”的siteLocation或类似“%”的公司)
这会给我带来错误。@AaronNewton
这意味着可以使用命名占位符
。在PHP中连接时,命名占位符怎么会有问题?显然,PHP中的连接既支持命名占位符又支持位置占位符,而且更便于移植,因为您可以对任何数据库使用相同的查询。我真的不明白为什么会有这么多人们认为命名占位符和位置占位符之间有任何区别。与公认的答案相比,使用命名占位符有什么好处吗?使用
bindValue
是否可以防止注入攻击?公认的答案通过将搜索字符串连接到
%
就像在旧时代一样。在$query->rowCount()==0之前使用否定有什么意义?这真的有意义吗?这来自手册:这是另一篇关于主题的文章:我真的很想知道你对这个问题的看法。可能的解决方案(未经测试)使用CONCAT,比如:$sql=“从项目名称中选择项目名称,如CONCAT('%,?,'%)”;参考:PDO不会逃逸%。是您的代码出错。对于解决方案,您应该阅读此处已提供的答案,谢谢您的建议。无论如何,测试的代码是手册中的代码,使用占位符避免SQL注入,我仍然得到相同的结果示例#6占位符P的使用无效使用上面的代码,而不是我的代码,确实可以逃逸%。我是论坛的新手,可能不了解评论、帖子和声誉的过程是如何在这里工作的,我会在下一篇文章中记住这一点,因为根据前面的评论,你需要声誉来帮助他人或发表评论。谢谢。我编辑了你的帖子,将代码放入代码块中——你可以请在上阅读更多关于帖子格式的信息。其他一些用户选择在没有留下评论的情况下对您的答案进行否决,因此我不确定否决的原因。这与接受的答案中的代码完全相同。事实上,不是,这是有区别的。如果您认为它们是完全相同的答案,您可能需要检查您的眼睛d、 @zdarma我想他的意思是代码几乎是一样的,它并没有添加太多新的关键信息。如果有人看到接受的答案,他可以在一秒钟后提出。这太明显了。StackOverflow的想法是,你提供了独特的答案,很容易理解,并且
$search = "%$search%";
$stmt  = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();
<?php
     $player = $_POST['search'];  //variable from my search form
     $find = $sqlPDO->prepare("SELECT player FROM salaries WHERE player ILIKE ?;");
     $find->execute(['%'.$player.'%']);

     while ($row = $find->fetch()) {
         echo $row['player']."</br>";
     }
?>