【问题标题】:Do PDO tokens need to match the bindValue 1:1?PDO 令牌是否需要与 bindValue 1:1 匹配?
【发布时间】:2016-08-12 05:51:29
【问题描述】:

我有一些代码

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

它抛出一个错误:

致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[HY093]:无效的参数号:绑定变量的数量与令牌的数量不匹配

显然,我的标记是绑定变量的两倍,但我拥有相同数量的唯一标记。所以我的问题是,每个令牌只能使用一次吗?我是否需要重命名每个令牌的第二个实例才能使其工作,或者有没有办法在不加倍 bindValue 语句的情况下做到这一点?

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    事实证明,您可以重复使用令牌。我的错误完全是另外一回事。因此,如果您将来发现这一点想知道同样的事情,是的,这是可能的。你的错误来自别的东西。可能错过了一个冒号,或者在你的一堆令牌中忘记添加一个bindValue

    如下 Barmar 所述,此功能可能需要启用PDO::ATTR_EMULATE_PREPARES 才能发生。 MySQL 默认开启,如果使用 Laravel 等框架,可能会关闭。

    This answer has instructions on how to enable for Laravel.

    【讨论】:

    • 我认为这只有在您启用了PDO::ATTR_EMULATE_PREPARES 时才有效。
    • 我重新打开了这个问题。从文档中引用的另一个问题的行不再存在,因此显然从那时起这在 PDO 中发生了变化。
    • @Barmar 这可能是真的。我使用默认启用的 MySQL。我想这在答案中值得注意。也感谢您重新打开。
    • 链接页面中有一条评论也有同样的观察。
    猜你喜欢
    • 1970-01-01
    • 2019-12-29
    • 2018-09-08
    • 2013-05-28
    • 2014-08-21
    • 2018-03-29
    • 1970-01-01
    • 2015-11-06
    • 2015-07-31
    相关资源
    最近更新 更多