PDO:当用相同的值替换多个参数时,"无效的参数号"

bar*_*art 8 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();
Run Code Online (Sandbox Code Playgroud)

ajr*_*eal 8

您为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);
Run Code Online (Sandbox Code Playgroud)
$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);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你所做的现有方法仍然存在SQL注入问题.

  • 仅当使用本机预处理语句*时,此问题才存在*,PDO模拟的语句可以多次处理具有名称的案例.要启用或禁用本机语句,可以使用`$ PDO-> setAttribute(PDO :: ATTR_EMULATE_PREPARES,false)`. (8认同)