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