【问题标题】:Can a string like 'LIMIT 0,50' be used with a named parameter?像 'LIMIT 0,50' 这样的字符串可以与命名参数一起使用吗?
【发布时间】:2013-06-30 02:08:57
【问题描述】:

我正在更新一些旧的 PHP 代码,但遇到了一个我不完全理解的问题。在过去的 mysql_* 函数中,您可以在 SQL 查询中包含一个变量,例如:

$query = "SELECT * FROM table $limit";

在哪里$limit = "LIMIT 0,50";。因此完整的查询是

$query = "SELECT * FROM table LIMIT 0,50";

一切正常。但是,对于 PDO 预准备语句和命名参数,这种类型的简单替换似乎是不可能的,除非您分解限制语句。例如:

$stmt = $conn->prepare('SELECT * FROM table :myLimit');
$stmt->execute(array(':myLimit'=>' LIMIT 0,50'));

导致错误:

错误:SQLSTATE[42000]:语法错误或访问冲突:1064 你 您的 SQL 语法有错误;检查对应的手册 您的 MySQL 服务器版本,以便在“?”附近使用正确的语法在线 1

但如果我将该查询更改为以下内容,以便进一步分解 LIMIT:

$stmt = $conn->prepare('SELECT * FROM table LIMIT :start,:end ');
$stmt->execute(array(':start'=>0,':end'=>50));

效果很好。

  • 那么为什么不使用:myLimit 作为命名参数和 array(':myLimit'=>' LIMIT 0,50') 作为价值工作?
  • 什么是 使用命名参数的规则,以及它们与 旧 mysql_* 的 SQL 字符串中的简单变量替换 函数可以使用吗?

php.net 上的 PDO 页面在谈到什么可以用作命名参数和不可以用作命名参数时有点模棱两可,我一直在寻找比我发现的更深入的东西:

  • 您必须为要传递给语句的每个值包含一个唯一的参数标记
  • 您不能在准备好的语句中两次使用同名的命名参数标记。
  • 您不能将多个值绑定到单个命名参数,例如 SQL 语句的 IN() 子句。

我目前使用的是 PHP 5.1.6

【问题讨论】:

  • 如果我错了,其他人会纠正我,但是当你绑定值时,它基本上会清理它们,因此它只是一个用于比较的值。由于 Limit 是一个保留字,它可能会对其进行清理。
  • 没有。占位符只能插入值。不是 sql 关键字。 LIMIT ?,? 是可能的,但不能将整个子语句作为单个占位符。
  • @MarcB - 是的,我通过反复试验发现了这一点。是否有任何文档可以解释参数限制的细节? Php.net 似乎掩盖了这一点。
  • 准备好的语句不像复制粘贴。它实际上更像是函数的单独参数,准备好的语句就是函数。
  • @Pitchinnate 没有像“消毒”这样的东西,而且 PDO 肯定不会这样做。

标签: php mysql pdo prepared-statement named-parameters


【解决方案1】:

为什么不使用 :myLimit 作为命名参数并使用 array(':myLimit'=>' LIMIT 0,50') 作为值?

因为准备好的语句仅用于数据

命名参数的使用规则是什么,它们与旧的 mysql_* 函数可以使用的 SQL 字符串中的简单变量替换有何不同?

规则很简单:您可以对数据使用(任何一种类型的)参数

我目前使用的是 PHP 5.1.6

男人。你知道,你升级有点晚了。大约十年左右。

您不能在准备好的语句中两次使用同名的命名参数标记。

确实如此。为了使用此功能,您必须打开仿真模式,这会给其他查询带来不便。

您不能将多个值绑定到单个命名参数,例如 SQL 语句的 IN() 子句。

确实如此。再次因为 [native] 准备好的语句仅适用于数据文字

【讨论】:

    【解决方案2】:

    当您绑定一个值时,您只能包含一个值,而不是查询的任何部分,而不是要检查的值。

    绑定值用于防止查询操作,因此如果您可以更改查询或将额外的 mysql 命令添加到绑定参数中,那么这将否定绑定值的全部意义

    例如,您可以绑定名称或数字来检查是否等于该值,您不能绑定条件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      相关资源
      最近更新 更多