PDO Anda dikonfigurasi untuk mengemulasi kueri yang disiapkan, sedangkan mysqli menggunakan kueri yang benar-benar disiapkan.
Kueri yang disiapkan mengikat string ''1''
sebagai nilai parameter bilangan bulat. PHP memaksanya menjadi integer menggunakan sesuatu seperti intval()
. Setiap string dengan karakter utama non-numerik ditafsirkan sebagai 0 oleh PHP, jadi nilai parameter dikirim setelah mempersiapkan adalah nilai 0.
Kueri palsu yang disiapkan menggunakan interpolasi string (bukannya mengikat) untuk menambahkan string ''1''
ke dalam kueri SQL sebelum MySQL mem-parsingnya. Tetapi hasilnya serupa, karena SQL juga memperlakukan string dengan karakter utama non-numerik dalam konteks integer sebagai nilai 0.
Satu-satunya perbedaan adalah apa yang berakhir di log kueri umum ketika parameter terikat sebelum persiapan versus setelah persiapan.
Anda juga dapat membuat PDO menggunakan kueri yang disiapkan secara nyata, jadi PDO harus bertindak seperti mysqli dalam kasus ini:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
PS:Ini mungkin menunjukkan alasan bagus mengapa nilai id biasanya dimulai dari 1, bukan 0.