我正在更新一些旧的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')
作为值有效吗?php.net上的PDO页面在可以和不能用作命名参数时有些含糊,我正在寻找比我发现的东西更深入的东西:
我当前正在使用PHP 5.1.6
为什么不使用:myLimit作为命名参数,而不使用array(':myLimit'=>'LIMIT 0,50')作为值起作用?
因为准备好的语句用于仅数据
使用命名参数的规则是什么,它们与旧mysql_ *函数可以使用的SQL字符串中的简单变量替换有何不同?
规则很简单:您可以对仅数据]使用(两种类型的)参数
我当前正在使用PHP 5.1.6
男人。您知道,升级有点晚了。大约十年左右。
您不能在准备好的语句中两次使用相同名称的命名参数标记。
是的。为了使用此功能,您必须打开仿真模式,这会使其他查询不方便。
例如,您不能在SQL语句的IN()子句中将多个值绑定到单个命名参数。
是的。再次因为[native]预处理语句仅适用于数据文字]
绑定值时,只能包含一个值,除了要检查的值以外,查询的任何部分都不能包含。