【问题标题】:PHP's PDO prepared statement: am I able to use one placeholder multiple times? [duplicate]PHP 的 PDO 准备语句:我可以多次使用一个占位符吗? [复制]
【发布时间】:2015-02-12 05:36:39
【问题描述】:

我想执行以下查询:

    选择
      *,
      (SELECT COUNT(*) FROM `tab2` WHERE `parent` = :id) AS `sum`
    从`tab1`
    WHERE `id` = :id

如您所见,:id 占位符在查询中出现了两次。因此,如果我尝试使用以下命令执行此语句:

$q->execute(['id'=>$row_id]);

我收到错误消息:

Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number

所以我必须重写准备好的查询并使用 :id1 和 :id2 占位符执行数组,这对我来说看起来有点愚蠢。

这是在准备好的语句的多个位置使用一个占位符的唯一方法吗?

【问题讨论】:

  • @DarkBee 有点。您发布为可能重复的链接使用SELECT :Param。最初的问题是 OP 试图绑定一个列。此问题stackoverflow.com/q/182287 解释并指定“表和列名称不能被PDO 中的参数替换”,来自同一页面上的答案stackoverflow.com/a/182353
  • @Fred-ii- true,但该页面上标记的答案表明占位符只能使用一次。
  • @Fred-ii- 我很惊讶。为什么会有这样的限制?!是 MySQL 的限制吗?
  • @Fred-ii- 我认为这不是开启 PDO::ATTR_EMULATE_PREPARES 的理由?
  • @DarkBee 是的,我同意,这就是为什么我的评论以“排序”开头;)

标签: php mysql pdo prepared-statement placeholder


【解决方案1】:

PDO::prepare 声明

[y]你不能在准备好的语句中多次使用同名的命名参数标记,除非仿真模式打开。

由于通常最好关闭仿真模式(因此数据库会执行准备好的语句),因此您必须使用 id_0id_1 等。

【讨论】:

  • 除非语句使用不同的值多次执行,否则真正的prepared statements不一定更好。
  • 不一定更好,但它们将参数解析/引用逻辑卸载到数据库中,这通常比 PHP 更快(至少对于那些任务而言)。
  • 使用真正的prepared statements时没有参数引用。
猜你喜欢
  • 2016-12-23
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 2012-12-14
  • 1970-01-01
相关资源
最近更新 更多