sql >> Base de Datos >  >> RDS >> Mysql

Palabra clave LIMIT en MySQL con declaración preparada

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);