【问题标题】:PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokensPDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: 绑定变量数与标记数不匹配
【发布时间】:2014-10-01 14:55:50
【问题描述】:

我收到错误消息:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /var/www/calendar/insert.php on line 17

但我不明白我做错了什么。

我有一个使用 6 个绑定的 INSERT 语句,我正在绑定 6,那么不匹配在哪里?

代码

插入

$stmt = $dbh->prepare("INSERT INTO bookings (forename, surname, badge, department, start, end) VALUES (:forename, :surname, :badge, :department, STR_TO_DATE(:dp1,'%Y-%m-%d'), STR_TO_DATE(:dp2,'%Y-%m-%d'))");

绑定

foreach ($_POST as $key => $value) {
  $stmt->bindParam('$key', $value);
  echo "Binding $key as $value <br>";
}

哪个输出:

Binding forename as John
Binding surname as Doe
Binding badge as 1 
Binding department as Days 
Binding dp1 as 2014-10-06 
Binding dp2 as 2014-10-10 

【问题讨论】:

  • 不应该'$key' 只是$key 吗?

标签: php mysql pdo


【解决方案1】:

由于您使用的是单引号,因此变量没有被插值,您需要将它们更改为双引号:

foreach ($_POST as $key => $value) {
  $stmt->bindParam(":$key", $_POST[$key]); // assuming $key matches those named placeholders

}

编辑:正如 @marc 所说,对 cme​​ts 有很好的了解,您只需使用 $value 即可获得最后一个值。

【讨论】:

  • 谢谢。它现在可以在没有错误消息的情况下工作,但插入在所有列上都使用2014-10-10
  • @user3973427 你是什么意思?不是dp1 = 2014-10-06dp2 = 2014-10-10吗?
  • bindParam 本质上设置了对绑定变量的引用。由于您在循环中绑定到 $value,因此您绑定到 VARIABLE $value,而不是它包含的特定迭代的值 - 这意味着您将获取循环的 LAST 值。尝试绑定到$_POST[$key]
  • @MarcB 谢谢(我明白,我想)!
【解决方案2】:
  • 不需要单引号'
  • 不需要冒号:
  • 改用bindValue

foreach ($_POST as $key => $value) {
    $stmt->bindValue($key, $value);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多