可以将诸如'LIMIT 0,50'之类的字符串与命名参数一起使用吗?

问题描述 投票:-28回答:2

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

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

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

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

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

$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')作为值有效吗?
  • 什么是使用命名参数的规则,以及它们与SQL字符串中的简单变量替换表示旧的mysql_ *函数可以使用吗?

php.net上的PDO页面在可以和不能用作命名参数时有些含糊,我正在寻找比我发现的东西更深入的东西:

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

我当前正在使用PHP 5.1.6

php mysql pdo prepared-statement named-parameters
2个回答
8
投票

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

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

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

规则很简单:您可以对仅数据]使用(两种类型的)参数

我当前正在使用PHP 5.1.6

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

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

是的。为了使用此功能,您必须打开仿真模式,这会使其他查询不方便。

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

是的。再次因为[native]预处理语句仅适用于数据文字]


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.