Apabila cuba melaksanakan pertanyaan SQL menggunakan kaedah bindValue untuk parametrize klausa LIMIT, PHP PDO boleh menambah petikan tunggal kepada nilai pembolehubah. Tingkah laku ini boleh membawa kepada ralat sintaks SQL seperti yang diperhatikan dalam coretan kod yang disediakan:
$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);
Mesej ralat "Anda mempunyai ralat dalam sintaks SQL anda" mungkin disebabkan oleh petikan tunggal yang ditambahkan pada :skip pembolehubah dalam klausa LIMIT.
Adalah dipercayai bahawa tingkah laku ini berkaitan dengan pepijat yang telah lama wujud dalam PDO yang dilaporkan pada tahun 2008: https://bugs.php.net/bug.php?id=44639
Penyelesaian:
Seperti yang dicadangkan dalam respons, menghantar nilai kepada integer sebelum lulus mereka kepada kaedah bindValue menyelesaikan isu ini:
$fetchPictures->bindValue(':skip', (int) trim($_GET['skip']), PDO::PARAM_INT);
Dengan menukar Pembolehubah $_GET['skip'] kepada integer menggunakan (int) sebelum mengikat, kami menghalang PDO daripada menambah petikan tunggal dan memastikan pertanyaan SQL dilaksanakan dengan betul.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Suntikan SQL Apabila Menggunakan `bindValue` dalam Klausa LIMIT?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!