Maison >développement back-end >tutoriel php >Comment éviter l'injection SQL lors de l'utilisation de « bindValue » dans une clause LIMIT ?
Lors de la tentative d'exécution d'une requête SQL à l'aide de la méthode bindValue pour paramétrer la clause LIMIT, PHP PDO peut ajouter guillemets simples aux valeurs des variables. Ce comportement peut entraîner des erreurs de syntaxe SQL, comme observé dans l'extrait de code fourni :
$fetchPictures->prepare("SELECT * FROM pictures WHERE album = :albumId ORDER BY id ASC LIMIT :skip, :max"); $fetchPictures->bindValue(':albumId', $_GET['albumid'], PDO::PARAM_INT); if(isset($_GET['skip'])) { $fetchPictures->bindValue(':skip', trim($_GET['skip']), PDO::PARAM_INT); } else { $fetchPictures->bindValue(':skip', 0, PDO::PARAM_INT); } $fetchPictures->bindValue(':max', $max, PDO::PARAM_INT); $fetchPictures->execute() or die(print_r($fetchPictures->errorInfo())); $pictures = $fetchPictures->fetchAll(PDO::FETCH_ASSOC);
Le message d'erreur "Vous avez une erreur dans votre syntaxe SQL" est probablement dû à l'ajout de guillemets simples à :skip variable dans la clause LIMIT.
On pense que ce comportement est lié à un bug de longue date dans PDO signalé en 2008 : https://bugs.php.net/bug.php?id=44639
Solution :
Comme suggéré dans la réponse, convertir les valeurs en entiers avant de passer les à la méthode bindValue résout ce problème :
$fetchPictures->bindValue(':skip', (int) trim($_GET['skip']), PDO::PARAM_INT);
En convertissant la variable $_GET['skip'] en un entier en utilisant (int) avant la liaison, nous empêchons PDO d'ajouter des guillemets simples et garantissons que la requête SQL est exécutée correctement.
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!