-29

我正在更新一些旧的 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

4

2 回答 2

8

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

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

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

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

我目前正在使用 PHP 5.1.6

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

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

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

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

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

于 2013-07-02T16:00:43.887 回答
0

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

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

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

于 2013-07-02T16:23:32.237 回答