php - PDO token 是否需要匹配 bindValue 1 :1?

标签 php mysql pdo

我有一些代码

$query = 'INSERT INTO table
                  (foo, bar, baz)
                  VALUES
                  (:foo, :bar, :baz)
          ON DUPLICATE KEY UPDATE foo = :foo,
                                  bar = :bar,
                                  baz = :baz';
$stmt = $dbc->prepare($query);
$stmt->bindValue(':foo', $foo, PDO::PARAM_STR);
$stmt->bindValue(':bar', $bar, PDO::PARAM_STR);
$stmt->bindValue(':baz', $baz, PDO::PARAM_STR);

$stmt->execute();

它抛出一个错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

显然,我拥有的 token 数量是绑定(bind)变量的两倍,但我拥有相同数量的唯一 token 。所以我的问题是,每个 token 只能使用一次吗?我是否需要重命名每个标记的第二个实例才能使其正常工作,或者是否有一种方法可以在不将我的 bindValue 语句加倍的情况下进行重命名?

最佳答案

事实证明,您可以重复使用 token 。我的错误完全是另一回事。因此,如果您将来发现此问题想知道同样的事情,是的,这是可能的。您的错误来自其他原因。可能漏掉了一个冒号,或者在你的一堆标记中忘记为其中一个添加 bindValue

正如下面 Barmar 所指出的,此功能可能需要 PDO::ATTR_EMULATE_PREPARES启用发生。 MySQL 默认启用它,但如果使用 Laravel 等框架,它可能会被关闭。

This answer has instructions on how to enable for Laravel.

关于php - PDO token 是否需要匹配 bindValue 1 :1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36728761/

相关文章:

php - 使用 Redis 变量作为本地 session 变量

php - 如何删除数组值中的空格?

php - Doctrine 如何删除缓存

php - 尝试更新 sql 数据库中的日期时如何修复此错误?

PHP PDO 事务自动回滚

PHP 运费计算器

php - 选择其中 - 自定义订单

mysql - 如何实现基于2列的sql查询进行外连接

mysql - 子查询未返回预期结果

php - 为 IN 语句 PDO MYSQL 转义字符串数组