Ada satu hal kecil untuk disebutkan. Secara default, PDO hanya meniru pernyataan yang telah disiapkan.
Dan saat dalam mode emulasi, ia menjalankan kueri lama yang sama tanpa benar-benar menyiapkan satu pernyataan :)
Jadi, pertama-tama,
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
untuk mengaktifkan pernyataan yang sudah disiapkan.
Ada hal kecil lain yang perlu disebutkan.
Sayangnya, hanya sedikit yang nyata pengetahuan di dunia. Dan terutama di dunia situs Q&A. Orang cenderung mengulangi informasi yang telah mereka baca dan dianggap masuk akal. Tanpa menjalankan tes apa pun untuk membuktikan atau bahkan tanpa meletakkan tangan mereka. Jadi, "sering dicatat" tidak boleh dianggap sebagai sumber yang dapat dipercaya sama sekali.
Kembali ke masalah:meskipun harus ada beberapa penalti, sebagian besar waktu seharusnya tidak signifikan. Jika ya - Anda harus menyetel sistem Anda.
Bagaimanapun, dalam mode emulasi Anda mendapatkannya "cepat" dan aman.
Perbarui
Nah, setelah menjalankan pengujian Anda pada data saya, saya harus mengatakan bahwa ada yang salah dengan database Anda jika Anda memiliki perbedaan 3 kali pada kumpulan data yang besar.
Untuk pertanyaan kilat
select title from Board where id = 1
hasilnya adalah
emulation on off
query 0.07 0.130
prepare 0.075 0.145
sedangkan untuk query yang cukup memberatkan
select title from Board where id > 1
hasilnya adalah
emulation on off
query 0.96 0.96
prepare 0.96 1.00
Jadi, seperti yang bisa kita lihat, pada kumpulan data yang besar perbedaannya tidak terlalu mencolok.
Untuk kueri kilat ada beberapa perbedaan, tetapi, karena hanya membutuhkan waktu 0,0003 detik (untuk satu kueri) - menurut saya itu adalah contoh sempurna untuk kata "ketidakpedulian".
Untuk hasil yang sama antara query()/prepare() - Saya hanya punya satu ide - PDO menggunakan persiapan/eksekusi untuk semua kueri, bahkan kueri tanpa ikatan.
Sekarang ke masalah penyandian.
Ya, masalah GBK yang aneh memang memengaruhi PDO untuk versi sebelumnya 5.3.3. Versi ini tidak memiliki cara untuk mengatur penyandian yang tepat dan tidak dapat dihindari rentan (dalam mode emulasi). Tetapi sejak 5.3.3 PDO mendukung pengaturan encoding di DSN, dan sekarang semuanya baik-baik saja dengan itu.
Untuk mysqli kita harus menggunakan mysqli_set_charset()
untuk tujuan ini dengan hasil yang sama (tidak dapat ditembus).
Di kelas saya sendiri yang didasarkan pada mysqli, saya menggunakan implementasi placeholder saya sendiri dan tidak menggunakan pernyataan yang disiapkan sama sekali. Bukan karena alasan kinerja tetapi untuk keandalan yang lebih baik.