Jika Anda menonaktifkan setelan default PDO::ATTR_EMULATE_PREPARES
, maka itu akan berhasil. Saya baru tahu bahwa pengaturan itu diaktifkan secara default untuk mysql, yang berarti Anda tidak pernah benar-benar menggunakan pernyataan yang disiapkan, php secara internal membuat sql dinamis untuk Anda, mengutip nilai untuk Anda dan mengganti placeholder. Ya, wtf utama.
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $pdo->prepare($sql);
$stmt->execute(array(5)); //works!
Persiapan diemulasi secara default karena alasan kinerja.
Lihat juga PDO MySQL:Gunakan PDO::ATTR_EMULATE_PREPARES atau tidak?