这是问题所在:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
PDOStatement::execute()的手册页说(强调我的):
参数
input_parameters
一个包含与正在执行的 SQL 语句中的绑定参数一样多的元素的值数组。所有值都被视为 PDO::PARAM_STR。
因此,您的参数将作为字符串插入,因此最终的 SQL 代码如下所示:
LIMIT '0', '10'
这是 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
文档必须说什么:
该LIMIT
子句可用于限制SELECT
语句返回的行数。LIMIT
接受一个或两个数字参数,它们都必须是非负整数常量,但以下情况除外:
您的选择包括:
一个个绑定参数,这样就可以设置类型了:
$comments->bindParam(1, $post, PDO::PARAM_STR);
$comments->bindParam(2, $min, PDO::PARAM_INT);
$comments->bindParam(3, $min, PDO::PARAM_INT);
不要将这些值作为参数传递:
$query = sprintf('SELECT id, content, date
FROM comment
WHERE post = ?
ORDER BY date DESC
LIMIT %d, %d', $min, $max);
禁用模拟准备(MySQL 驱动程序有一个错误/功能会使其引用数字参数):
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);