Maison >développement back-end >tutoriel php >Comment utiliser correctement LIMIT avec les instructions préparées dans MySQL ?
Utilisation du mot clé LIMIT avec des instructions préparées dans MySQL
La clause LIMIT dans MySQL est utilisée pour limiter le nombre de lignes renvoyées par une requête SELECT . Cependant, lors de l'utilisation de LIMIT avec des instructions préparées (PDO), les utilisateurs peuvent rencontrer des problèmes s'ils fournissent des valeurs pour les paramètres sous forme de chaînes.
Identification du problème :
L'erreur se produit car la méthode execute() de PDO traite automatiquement tous les paramètres comme des chaînes, quel que soit leur type de données réel. Cela peut entraîner des erreurs d'analyse si des valeurs numériques sont attendues dans la clause LIMIT.
Par exemple, la requête suivante échouera avec une erreur d'analyse :
SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT ?, ?
Si les paramètres ($min et $max) sont transmis sous forme de chaînes, l'instruction SQL résultante sera :
LIMIT '0', '10'
Cette syntaxe n'est pas valide dans MySQL car les valeurs de LIMIT doivent être numérique.
Solutions :
Il existe plusieurs façons de résoudre ce problème :
Lier explicitement les paramètres à l'instruction, en spécifiant leurs données respectives types :
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
Au lieu de transmettre les valeurs de LIMIT en tant que paramètres, ajoutez-les manuellement à la requête string :
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
Le pilote MySQL possède une fonctionnalité qui cite les arguments numériques dans les instructions préparées. Cela peut être désactivé en définissant l'attribut ATTR_EMULATE_PREPARES sur FALSE :
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!