Inilah masalahnya:
$comments = $db->prepare($query);
/* where $db is the PDO object */
$comments->execute(array($post, $min, $max));
Halaman manual untuk PDOStatement::execute() mengatakan (penekanan pada saya):
Parameter
input_parameters
Array nilai dengan elemen sebanyak parameter terikat dalam pernyataan SQL yang dieksekusi. Semua nilai diperlakukan sebagai PDO::PARAM_STR .
Dengan demikian parameter Anda dimasukkan sebagai string, sehingga kode SQL terakhir terlihat seperti ini:
LIMIT '0', '10'
Ini adalah kasus khusus di mana MySQL tidak akan mentransmisikan ke nomor tetapi memicu kesalahan penguraian:
mysql> SELECT 1 LIMIT 0, 10;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> SELECT 1 LIMIT '0', '10';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '10'' at line 1
Apa dokumen harus mengatakan:
LIMIT
klausa dapat digunakan untuk membatasi jumlah baris yang dikembalikan olehSELECT
penyataan.LIMIT
mengambil satu atau dua numerikargumen, yang keduanya harus berupa konstanta bilangan bulat non-negatif, dengan pengecualian berikut:
Dalam pernyataan yang disiapkan,
LIMIT
parameter dapat ditentukan menggunakan ? penanda placeholder.Dalam program yang tersimpan,
LIMIT
parameter dapat ditentukan menggunakan parameter rutin bernilai integer atau variabel lokal.
Pilihan Anda meliputi:
-
Ikat parameter satu per satu sehingga Anda dapat menetapkan jenis:
$comments->bindParam(1, $post, PDO::PARAM_STR); $comments->bindParam(2, $min, PDO::PARAM_INT); $comments->bindParam(3, $min, PDO::PARAM_INT);
-
Jangan berikan nilai tersebut sebagai parameter:
$query = sprintf('SELECT id, content, date FROM comment WHERE post = ? ORDER BY date DESC LIMIT %d, %d', $min, $max);
-
Nonaktifkan persiapan yang diemulasi (driver MySQL memiliki bug/fitur yang akan membuatnya mengutip argumen numerik):
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);