Beim Versuch, eine SQL-Abfrage mit der bindValue-Methode auszuführen, um die LIMIT-Klausel zu parametrisieren, kann PHP PDO hinzufügen einfache Anführungszeichen für die Variablenwerte. Dieses Verhalten kann zu SQL-Syntaxfehlern führen, wie im bereitgestellten Code-Snippet beobachtet:
$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);
Die Fehlermeldung „Sie haben einen Fehler in Ihrer SQL-Syntax“ wird wahrscheinlich dadurch verursacht, dass einfache Anführungszeichen zum :skip hinzugefügt werden Variable in der LIMIT-Klausel.
Es wird angenommen, dass dieses Verhalten mit einem seit langem bestehenden Fehler in PDO zusammenhängt, der 2008 gemeldet wurde: https://bugs.php.net/bug.php?id=44639
Lösung:
Wie in der Antwort vorgeschlagen, werden die Werte vor der Übergabe in Ganzzahlen umgewandelt Sie an die bindValue-Methode zu übergeben, löst dieses Problem:
$fetchPictures->bindValue(':skip', (int) trim($_GET['skip']), PDO::PARAM_INT);
Durch Konvertieren der Variablen $_GET['skip'] in eine Ganzzahl Durch die Verwendung von (int) vor der Bindung verhindern wir, dass PDO einfache Anführungszeichen hinzufügt, und stellen sicher, dass die SQL-Abfrage korrekt ausgeführt wird.
Das obige ist der detaillierte Inhalt vonWie vermeide ich SQL-Injection bei Verwendung von „bindValue' in einer LIMIT-Klausel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!