Maison > développement back-end > tutoriel php > Comment utiliser correctement LIMIT avec les instructions préparées dans MySQL ?

Comment utiliser correctement LIMIT avec les instructions préparées dans MySQL ?

Linda Hamilton
Libérer: 2024-11-28 14:05:14
original
695 Les gens l'ont consulté

How to Correctly Use LIMIT with Prepared Statements in 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 ?, ?
Copier après la connexion

Si les paramètres ($min et $max) sont transmis sous forme de chaînes, l'instruction SQL résultante sera :

LIMIT '0', '10'
Copier après la connexion

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 :

  1. Lier les paramètres un par un :

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);
Copier après la connexion
  1. Ne pas transmettre les paramètres :

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);
Copier après la connexion
  1. Désactiver l'émulation Prépare :

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal