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')值的工作呢?php.net上的PDO页面有些含糊不清,当涉及到什么可以和不能用作命名参数时,我正在寻找比我发现的更深入的东西:
我目前正在使用PHP 5.1.6
为什么不使用:myLimit作为命名参数和数组(':myLimit'=>'LIMIT 0,50')作为值工作?
因为预准备语句仅用于数据
使用命名参数有哪些规则,它们与旧的mysql_*函数可以使用的SQL字符串中的简单变量替换有何不同?
规则很简单:您可以仅为数据使用(任一类型的)参数
我目前正在使用PHP 5.1.6
人.你知道,你升级有点晚了.大约十年左右.
您不能在预准备语句中两次使用同名的命名参数标记.
在现代版本中,您可以.
您不能将多个值绑定到单个命名参数,例如,SQL语句的IN()子句.
确实如此.再次因为[native] prepared语句仅用于数据文字
| 归档时间: |
|
| 查看次数: |
1295 次 |
| 最近记录: |