gen*_*xyz 21 php mysql prepared-statement limit
SELECT id, content, date
FROM comment
WHERE post = ?
ORDER BY date DESC
LIMIT ?, ?
Run Code Online (Sandbox Code Playgroud)
使用PDO(我正在使用具有Apache 2.2.21的MAMP 2.0.5,PHP高达5.3.6和MySQL 5.5.9)准备语句这不起作用,如果我更改查询
LIMIT 0, 10
Run Code Online (Sandbox Code Playgroud)
有用.
我在MySQL的错误中看到这是以前版本中的一个错误,但我无法理解这是否仍有待修复.
如果这仍然是个问题,有办法以另一种方式选择一系列行吗?
码:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
Run Code Online (Sandbox Code Playgroud)
Álv*_*lez 43
这是问题所在:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
Run Code Online (Sandbox Code Playgroud)
PDOStatement :: execute()的手册页说(强调我的):
参数
input_parameters
一个值数组,其元素与正在执行的SQL语句中的绑定参数一样多.所有值都被视为PDO :: PARAM_STR.
因此,您的参数将作为字符串插入,因此最终的SQL代码如下所示:
LIMIT '0', '10'
Run Code Online (Sandbox Code Playgroud)
这是一种特殊情况,MySQL不会转换为数字但会触发解析错误:
mysql> SELECT 1 LIMIT 0, 10;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> SELECT 1 LIMIT '0', '10';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '10'' at line 1
Run Code Online (Sandbox Code Playgroud)
文档有什么要说的:
该
LIMIT
子句可用于约束SELECT
语句返回的行数.LIMIT
取一个或两个数字参数,它们都必须是非负整数常量,但有以下例外:
在准备好的语句中,
LIMIT
可以使用?指定参数?占位符标记.在存储的程序中,
LIMIT
可以使用整数值例程参数或局部变量来指定参数.
您的选择包括:
逐个绑定参数,以便设置类型:
$comments->bindParam(1, $post, PDO::PARAM_STR);
$comments->bindParam(2, $min, PDO::PARAM_INT);
$comments->bindParam(3, $min, PDO::PARAM_INT);
Run Code Online (Sandbox Code Playgroud)不要将这些值作为参数传递:
$query = sprintf('SELECT id, content, date
FROM comment
WHERE post = ?
ORDER BY date DESC
LIMIT %d, %d', $min, $max);
Run Code Online (Sandbox Code Playgroud)禁用模拟准备(MySQL驱动程序有一个错误/功能,使其引用数字参数):
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
Run Code Online (Sandbox Code Playgroud)您可以声明一个特定的属性来解决问题。
$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
Run Code Online (Sandbox Code Playgroud)
另一个答案说明了它是如何工作的。默认情况下,PDO 仅模拟准备,并且当您以静默方式绑定变量时,不设置类型,默认情况下 PDO 将它们视为字符串。SQL 中的字符串必须被引用和转义 - 因此您的 LIMIT 子句中有引号和语法错误。而当使用本机准备好的语句时,数据库可以设法挑选出适当的类型。
归档时间: |
|
查看次数: |
17621 次 |
最近记录: |