Php mysql PDO如何绑定
在这个查询中Php mysql PDO如何绑定,php,mysql,pdo,bindparam,Php,Mysql,Pdo,Bindparam,在这个查询中 select wrd from tablename WHERE wrd LIKE '$partial%' 我正在尝试用PDO绑定变量“$partial%”。不确定这如何与结尾的%一起工作 是吗 select wrd from tablename WHERE wrd LIKE ':partial%' select wrd from tablename WHERE wrd LIKE ':partial' 其中:partial绑定到$partial=“somet” 还是会这样 se
select wrd from tablename WHERE wrd LIKE '$partial%'
我正在尝试用PDO绑定变量“$partial%”
。不确定这如何与结尾的%
一起工作
是吗
select wrd from tablename WHERE wrd LIKE ':partial%'
select wrd from tablename WHERE wrd LIKE ':partial'
其中:partial
绑定到$partial=“somet”
还是会这样
select wrd from tablename WHERE wrd LIKE ':partial%'
select wrd from tablename WHERE wrd LIKE ':partial'
其中:partial
绑定到$partial=“somet%”
还是完全不同
$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 =$dbh->prepare('select wrd from tablename WHERE wrd LIKE ?');
$stmt->execute(array('partial%'));
$rs =$stmt->fetchAll();
你也可以说:
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);
谁编写了answare(可能是karim79): 使用问号参数:
$stmt = $dbh->prepare('select wrd from tablename WHERE wrd LIKE ?');
$stmt->execute(array('partial%'));
$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%'));
因为“部分”一词是在答案中指定的,不能更改。非常感谢。你应该这样做
bindValue(':partial', '%' . $_GET['partial'] . '%');
谢谢
Qwerty下面的代码只显示数据库中的第一个关键字
"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')"
如果要搜索数据库中的所有关键字,请尝试此项
"SELECT wrd FROM tablename WHERE wrd LIKE :partial";
$stmt->execute(array(':partial'=>'%'.$YourVarHere.'%'));
您可以在准备语句之前使用addcslashes。我在mysql上进行了测试
$value = addcslashes($value, '%');
$stmt = $db->prepare('select * from products where description like ?');
$stmt->execute(["$value%"]);
我认为公认的答案(由@bobince)可以简化一点 您可以将其减少为类似以下内容,以处理参数中的下划线、百分比等,但仍可以将like查询与partial%匹配:
$stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial");
$stmt->execute([":partial" => addcslashes($value, '_%') . "%"]);
$rows = $stmt->fetchAll();
逃跑还是不逃跑。。。这取决于角色的意图。它的意图是通配符还是文字?我不希望一份事先准备好的声明能为我做出决定。它的工作是对值中的字符进行转义,以终止
LIKE
子句,并为“凌乱”解决方案注入不需要的sql.+1。我唯一不使用它的时候是,如果我想给我的用户在他们自己的搜索字符串中添加通配符的能力。我想补充一点,为什么str_replace不循环-,因为str_replace()从左到右替换,所以首先对+
进行转义,然后%
,最后是
。。。所以不,这是一个非常糟糕的主意。@a没有解释的命令你的评论是没有帮助的。即使有抽象,在查询中使用原始的未过滤的GET值听起来是一个非常糟糕的时刻。