Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql PDO如何绑定_Php_Mysql_Pdo_Bindparam - Fatal编程技术网

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值听起来是一个非常糟糕的时刻。