Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.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 PDO:用相同值替换多个参数时“参数编号无效”_Php_Mysql_Pdo - Fatal编程技术网

Php PDO:用相同值替换多个参数时“参数编号无效”

Php PDO:用相同值替换多个参数时“参数编号无效”,php,mysql,pdo,Php,Mysql,Pdo,如果参数在查询中多次出现,我该如何绑定它,如下所示 $STH = $DBH->prepare("SELECT * FROM $table WHERE firstname LIKE :string OR lastname LIKE :string"); $STH->bindValue(':string', '%'.$string.'%', PDO::PARAM_STR); $result = $STH->execute(); 您在prepare语句中提到了两个同名的参数,但是

如果参数在查询中多次出现,我该如何绑定它,如下所示

$STH = $DBH->prepare("SELECT * FROM $table WHERE firstname LIKE :string OR lastname LIKE :string");

$STH->bindValue(':string', '%'.$string.'%', PDO::PARAM_STR);
$result = $STH->execute();

您在prepare语句中提到了两个同名的参数,但是您只为第一个参数提供了一个值,这就是错误所在

不太清楚PDO是如何在内部解决相同的参数名问题的,但您总是可以避免这个问题

两种可能的解决办法:

$sql = "select * from $table ".
       "where "
       "first_name like concat('%', :fname, '%') or ".
       "last_name  like concat('%', :lname, '%')";
$stmt= $DBH->prepare($sql);
$stmt->bindValue(':fname', $string, PDO::PARAM_STR);
$stmt->bindValue(':lname', $string, PDO::PARAM_STR);

顺便说一句,您现有的方式仍然存在SQL注入问题。

Thx ajreal,为什么我的方式仍然对注入敏感?因为您将所有内容都包含在完整的SQL中,而您应该只绑定要搜索的确切值,如example@ajreal字体只是一件小事:你少了一个。where和first_name之间的点…只有在使用本机准备的语句时才存在此问题,PDO模拟语句可以多次处理带有名称的大小写。要启用或禁用本机语句,可以使用$PDO->setAttributePDO::ATTR_EMULATE_PREPARES,false。@谢谢您提供的额外信息,当我遇到以下情况时,我刚刚切换到本机准备语句:
$sql = "select * from $table ".
       "where "
       "first_name like concat('%', ?, '%') or ".
       "last_name  like concat('%', ?, '%')";
$stmt= $DBH->prepare($sql);
$stmt->bindValue(1, $string, PDO::PARAM_STR);
$stmt->bindValue(2, $string, PDO::PARAM_STR);