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 查询