mysql PDO如何绑定LIKE

Posted

技术标签:

【中文标题】mysql PDO如何绑定LIKE【英文标题】:mysql PDO how to bind LIKE 【发布时间】:2011-02-12 21:48:21 【问题描述】:

在这个查询中

select wrd from tablename WHERE wrd LIKE '$partial%'

我正在尝试将变量 '$partial%' 与 PDO 绑定。不确定这如何与最后的 % 一起使用。

会不会

select wrd from tablename WHERE wrd LIKE ':partial%'

其中:partial 绑定到$partial="somet"

还是这样

select wrd from tablename WHERE wrd LIKE ':partial'

其中:partial 绑定到$partial="somet%"

还是会完全不同?

【问题讨论】:

【参考方案1】:

你也可以说:

SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')

mysql 端进行字符串连接,并不是说在这种情况下有任何特殊原因。

如果您要查找的部分 wrd 本身可以包含百分号或下划线字符(因为它们对于 LIKE 运算符具有特殊含义)或反斜杠(MySQL 将其用作另一层转义,事情会变得更加棘手在 LIKE 运算符中 — 不正确,根据 ANSI SQL 标准)。

希望这不会影响您,但如果您确实需要正确处理这种情况,这里有一个混乱的解决方案:

$stmt= $db->prepare("SELECT wrd FROM tablename WHERE wrd LIKE :term ESCAPE '+'");
$escaped= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $var);
$stmt->bindParam(':term', $escaped);

【讨论】:

逃还是不逃……这取决于角色的意图。它的意图是成为通配符还是文字?我不希望有一个准备好的声明来为我做出决定。它的工作是转义值中会终止 LIKE 子句并注入不需要的 sql 的字符。 +1 表示“混乱”的解决方案。我唯一不会使用它的情况是,如果我想让我的用户能够将通配符放在他们自己的搜索字符串中。 我想补充一下为什么 str_replace 不循环 - Because str_replace() replaces left to right 所以首先,+ 被转义,然后是 %,最后是 _ ...所以没有 +++++++++ :-)【参考方案2】:

我认为接受的答案(@bobince)可以简化一点。

您可以将其缩减为类似这样以处理参数中的下划线、百分比等,但仍将 LIKE 查询与部分百分比匹配:

$stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial");
$stmt->execute([":partial" => addcslashes($value, '_%') . "%"]);
$rows = $stmt->fetchAll();

【讨论】:

【参考方案3】:

您可以在准备好的语句之前使用 addcslashes。我在mysql上测试过。

$value = addcslashes($value, '%');
$stmt = $db->prepare('select * from products where description like ?');
$stmt->execute(["$value%"]);

【讨论】:

【参考方案4】:

下面的代码只显示了数据库中的第一个关键字!

"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')"

如果你想从数据库中搜索所有关键字,试试这个

"SELECT wrd FROM tablename WHERE wrd LIKE :partial";
$stmt->execute(array(':partial'=>'%'.$YourVarHere.'%'));

【讨论】:

【参考方案5】:

你应该这样做

bindValue(':partial', '%' . $_GET['partial'] . '%');

谢谢,

Qwerty

【讨论】:

这是一个非常糟糕的主意。 @acoder 没有解释你的评论没有帮助。 即使是抽象的,在查询中使用未经过滤的原始 _GET 值听起来等待发生的时间真的很糟糕。【参考方案6】:

谁编写了答案(可能是 karim79):

$var ="partial%"
$stmt =$dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial")
$stmt->bindParam(":partial",$var)
$stmt->execute(); //or$stmt->execute(array(':partial'=>$var)); without 
                  // first calling bindParam()
$rs =$stmt->fetchAll();

使用问号参数:

$stmt =$dbh->prepare('select wrd from tablename WHERE wrd LIKE ?');
$stmt->execute(array('partial%'));
$rs =$stmt->fetchAll();

非常感谢他。我正在搜索代码并看到很多示例,但我无法解决我的问题。这次我成功了。我使用了代码的“使用问号参数:”部分。

对于其他人的帮助,如果您想从变量中检索值,您可以将代码更改为

$stmt->execute(array($variable.'%'));

而不是

$stmt->execute(array('partial%'));

因为“部分”一词已在答案中指定且无法更改。非常感谢。

【讨论】:

【参考方案7】:
$var = "partial%";
$stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial");
$stmt->bindParam(":partial", $var);
$stmt->execute(); // or $stmt->execute(array(':partial' => $var)); without 
                  // first calling bindParam()
$rs = $stmt->fetchAll();

使用问号参数:

$stmt = $dbh->prepare('select wrd from tablename WHERE wrd LIKE ?');
$stmt->execute(array('partial%'));
$rs = $stmt->fetchAll();

http://www.php.net/manual/en/pdo.prepare.php

【讨论】:

以上是关于mysql PDO如何绑定LIKE的主要内容,如果未能解决你的问题,请参考以下文章

使用 LIKE 和绑定值的 PDO 准备语句未找到任何结果 [重复]

在 bindParam 中使用 LIKE 进行 MySQL PDO 查询

如何使用 PDO 进行 LIKE 搜索?

如何开启PDO,PDO_MYSQL扩展

如何在不使用 PDO 或 PHP 应用程序绑定的情况下解决二阶 SQL 注入

PHP PDO 准备语句——MySQL LIKE 查询