像'LIMIT 0,50'这样的字符串可以和命名参数一起使用吗?

j08*_*691 -26 php mysql pdo prepared-statement named-parameters

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

$query = "SELECT * FROM table $limit";
Run Code Online (Sandbox Code Playgroud)

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

$query = "SELECT * FROM table LIMIT 0,50";
Run Code Online (Sandbox Code Playgroud)

一切都很好.但是,对于PDO预处理语句和命名参数,除非您分解限制语句,否则这种类型的简单替换似乎不可能.例如:

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

导致错误:

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

(在旁注上我发现错误完全没用,因为没有使用问号 - 但回到手头的问题)

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

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

它很棒.

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

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

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

我目前正在使用PHP 5.1.6

You*_*nse 7

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

因为预准备语句仅用于数据

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

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

我目前正在使用PHP 5.1.6

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

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

在现代版本中,您可以.

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

确实如此.再次因为[native] prepared语句仅用于数据文字