Ето проблема:
$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
приема един или два числови аргумента, като и двете трябва да са неотрицателни целочислени константи, с тези изключения:
В рамките на подготвени оператори,
LIMIT
параметрите могат да се задават с помощта на ? маркери за място.В рамките на съхранените програми
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);