MySQL的准备语句LIMIT关键字

SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT ?, ? 

与PDO(我使用MAMP 2.0.5,有Apache 2.2.21,PHP 5.3.6和MySQL 5.5.9)准备语句这不起作用,如果我改变查询

 LIMIT 0, 10 

有用。

我看到MySQL的错误,这是以前的版本中的错误,但我不明白,如果这仍然是要解决的。

如果这仍然是一个问题,有办法以另一种方式select一系列的行?

码:

 $comments = $db->prepare($query); /* where $db is the PDO object */ $comments->execute(array($post, $min, $max)); 

这是问题:

 $comments = $db->prepare($query); /* where $db is the PDO object */ $comments->execute(array($post, $min, $max)); 

PDOStatement :: execute()的手册页说(强调我的):

参数

input_parameters具有与正在执行的SQL语句中的绑定参数一样多的元素的值的数组。 所有的值都被视为PDO :: PARAM_STR

因此你的参数被插入为string,所以最终的SQL代码如下所示:

 LIMIT '0', '10' 

这是一个特殊情况,MySQL不会强制转换为数字,但会触发parsing错误:

 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需要一个或两个数字参数,它们都必须是非负整数常量,但有以下例外:

  • 在准备好的语句中, LIMIT参数可以用? 占位符标记。

  • 在存储的程序中, LIMIT参数可以使用整数值例程参数或局部variables来指定。

您的select包括:

  • 绑定参数一个接一个,所以你可以设置一个types:

     $comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT); 
  • 不要将这些值作为parameter passing:

     $query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max); 
  • 禁用模拟准备(MySQL驱动程序有一个错误/function,它会引用数字参数):

     $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); 
 $dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false ); 

将解决这个问题。