Aquí está el problema:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
La página del manual para PDOStatement::execute() dice (énfasis mío):
Parámetros
input_parameters
Una matriz de valores con tantos elementos como parámetros enlazados hay en la instrucción SQL que se está ejecutando. Todos los valores se tratan como PDO::PARAM_STR .
Por lo tanto, sus parámetros se insertan como cadenas, por lo que el código SQL final se ve así:
LIMIT '0', '10'
Este es un caso particular en el que MySQL no emitirá un número pero desencadenará un error de análisis:
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
Qué docs tengo que decir:
El LIMIT
La cláusula se puede usar para restringir el número de filas devueltas por SELECT
declaración. LIMIT
toma uno o dos argumentos numéricos, que deben ser constantes enteras no negativas, con estas excepciones:
-
Dentro de declaraciones preparadas,
LIMIT
los parámetros se pueden especificar usando ? marcadores de marcador de posición. -
Dentro de los programas almacenados,
LIMIT
los parámetros se pueden especificar utilizando parámetros de rutina con valores enteros o variables locales.
Sus opciones incluyen:
-
Vincule los parámetros uno por uno para que pueda establecer un tipo:
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
-
No pase esos valores como parámetros:
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
-
Deshabilite las preparaciones emuladas (el controlador MySQL tiene un error/característica que hará que cite argumentos numéricos):
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);