PDO令牌是否需要匹配bindValue 1:1?

amf*_*are 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();
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误:

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

显然,我有两倍于绑定变量的令牌,但我拥有相同数量的唯一令牌.所以我的问题是,每个令牌只能使用一次吗?我是否需要重命名每个令牌的第二个实例以使其工作,或者有没有办法在不增加我的bindValue陈述的情况下执行此操作?

amf*_*are 5

事实证明,您可以重复使用令牌.我的错误完全是另一回事.因此,如果您在将来发现这个想法同样的事情,是的,这是可能的.您的错误来自其他方面.可能错过了冒号或在你的乱七八糟的令牌中忘记添加bindValue一个.

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

这个答案有关于如何启用Laravel的说明.