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);