PDO令牌是否需要匹配bindValue 1:1?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PDO令牌是否需要匹配bindValue 1:1?相关的知识,希望对你有一定的参考价值。
我有一些代码
$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
语句的情况下执行此操作?
答案
事实证明,您可以重复使用令牌。我的错误完全是另一回事。因此,如果您在将来发现这个想法同样的事情,是的,这是可能的。您的错误来自其他方面。可能错过了冒号或在你的乱七八糟的令牌中忘记添加一个bindValue
。
如下面的Barmar所述,此功能可能需要启用PDO::ATTR_EMULATE_PREPARES
。 mysql默认启用它,但如果使用Laravel等框架,它可能会被关闭。
This answer has instructions on how to enable for Laravel.
以上是关于PDO令牌是否需要匹配bindValue 1:1?的主要内容,如果未能解决你的问题,请参考以下文章
PHP PDO 与 bindParam 与 bindValue? [复制]
PDO->bindParam、PDO->bindValue 和 PDO->closeCursor
在 PDO::bindValue() 中使用显式数据类型有啥意义?