在预准备语句中使用占位符时出错

时间:2016-04-28 10:08:53

标签: php mysql pdo

使用下面的代码时出现此错误(所有内容都在try catch块中):

  

SQLSTATE [HY093]:参数号无效:绑定变量数   与令牌数量不匹配

$item_q = 4;
$item_no = 12;

$update = $db->prepare("UPDATE stock 
  SET quantity = quantity - :item_q 
  WHERE item_number = :item_no");

$update->execute([':item_q' => $item_q]);
$update->execute([':item_no' => $item_no]);

这是:item_q导致问题而我不知道它是什么。当我使用数字替换sql查询中的:item_q时,它可以工作。我很高兴能得到一些帮助! :)

3 个答案:

答案 0 :(得分:5)

问题

目前,您每次都使用一个参数绑定执行两次。

解决方案

您希望先绑定参数然后执行,或者使用两个参数绑定执行。

使用 PDOStatement::execute() 功能

中的两个绑定值执行
$update->execute([":item_q" => $item_q, ":item_num" => $item_no]);

使用 PDOStatement::bindParam() 功能

执行绑定参数后
$update->bindParam(":item_q", $item_q, PDO::PARAM_INT);
$update->bindParam(":item_num", $item_no, PDO::PARAM_STR);
$update->execute();

答案 1 :(得分:4)

问题在于执行你的陈述两次。

$update->execute([':item_q' => $item_q]);
$update->execute([':item_no' => $item_no]);

将其合并为一个

$update->execute([':item_q' => $item_q,':item_no' => $item_no]);

答案 2 :(得分:0)

试试这个并告诉我它是否无效

 $update->execute([':item_q' => $item_q,':item_no' => $item_no]);