Saya tahu bahwa PDO tidak mendukung banyak kueri yang dieksekusi dalam satu pernyataan. Saya telah Googleing dan menemukan beberapa posting yang berbicara tentang PDO_MYSQL dan PDO_MYSQLND.
PDO_MySQL adalah aplikasi yang lebih berbahaya daripada aplikasi MySQL tradisional lainnya. MySQL tradisional hanya mengizinkan satu kueri SQL. Di PDO_MySQL tidak ada batasan seperti itu, tetapi Anda berisiko disuntik dengan banyak kueri.
Dari: Perlindungan terhadap SQL Injection menggunakan PDO dan Zend Framework (Juni 2010; oleh Julian)
Sepertinya PDO_MYSQL dan PDO_MYSQLND memang menyediakan dukungan untuk beberapa kueri, tetapi saya tidak dapat menemukan informasi lebih lanjut tentang mereka. Apakah proyek ini dihentikan? Apakah sekarang ada cara untuk menjalankan banyak query menggunakan PDO.
Jawaban:
Seperti yang saya tahu,
PDO_MYSQLND
digantiPDO_MYSQL
dengan PHP 5.3. Bagian yang membingungkan adalah nama itu diamPDO_MYSQL
. Jadi sekarang ND adalah driver default untuk MySQL + PDO.Secara keseluruhan, untuk menjalankan beberapa kueri sekaligus, Anda membutuhkan:
PDO::ATTR_EMULATE_PREPARES
diatur ke1
(default). Alternatifnya, Anda dapat menghindari penggunaan pernyataan yang disiapkan dan digunakan$pdo->exec
secara langsung.Menggunakan exec
Menggunakan pernyataan
Sebuah catatan:
Saat menggunakan pernyataan siap yang diemulasi, pastikan Anda telah menyetel pengkodean yang tepat (yang mencerminkan pengkodean data aktual) di DSN (tersedia sejak 5.3.6). Jika tidak, ada kemungkinan kecil untuk injeksi SQL jika beberapa pengkodean aneh digunakan .
sumber
Setelah setengah hari mengotak-atik ini, ternyata PDO memiliki bug di mana ...
-
-
-
Itu akan mengeksekusi
"valid-stmt1;"
, berhenti"non-sense;"
dan tidak pernah membuat kesalahan. Tidak akan menjalankan"valid-stmt3;"
, mengembalikan kebenaran dan berbohong bahwa semuanya berjalan dengan baik.Saya berharap itu salah
"non-sense;"
tapi ternyata tidak.Di sinilah saya menemukan info ini: Permintaan PDO yang tidak valid tidak mengembalikan kesalahan
Berikut bugnya: https://bugs.php.net/bug.php?id=61613
Jadi, saya mencoba melakukan ini dengan mysqli dan belum benar-benar menemukan jawaban yang pasti tentang cara kerjanya jadi saya pikir saya tinggalkan saja di sini untuk mereka yang ingin menggunakannya ..
sumber
$pdo->exec("valid-stmt1; non-sense; valid-stmt3;");
tanpa dua eksekutif sebelumnya? Saya bisa membuatnya membuang kesalahan di tengah, tetapi tidak ketika dijalankan setelah eksekutif sukses .$pdo->exec("")
tidak tergantung satu sama lain. Sekarang saya membaginya untuk menunjukkan bahwa mereka tidak harus berurutan agar masalah muncul. Ketiga adalah 3 konfigurasi menjalankan beberapa query dalam satu pernyataan exec.exec
di halaman, tetapi jika saya menjalankan beberapaexec
masing-masing dengan beberapa pernyataan SQL di dalamnya, maka saya mereproduksi bug yang sama di sini. Tetapi jika itu satu-satunyaexec
di halaman, maka saya tidak dapat mereproduksinya.exec
di halaman Anda memiliki banyak pernyataan?Pendekatan cepat dan kotor:
Perpecahan pada titik akhir pernyataan SQL yang wajar. Tidak ada pemeriksaan kesalahan, tidak ada perlindungan injeksi. Pahami penggunaan Anda sebelum menggunakannya. Secara pribadi, saya menggunakannya untuk menyemai file migrasi mentah untuk pengujian integrasi.
sumber
;
istirahat jika SQL Anda berisi prosedur atau definisi pemicu ... Banyak alasan mengapa itu tidak baik.Seperti ribuan orang, saya mencari pertanyaan ini:
Dapat menjalankan beberapa kueri secara bersamaan, dan jika ada satu kesalahan, tidak ada yang akan berjalan Saya membuka halaman ini di mana-mana
Tetapi meskipun teman-teman di sini memberikan jawaban yang baik, jawaban ini tidak baik untuk masalah saya
Jadi saya menulis sebuah fungsi yang bekerja dengan baik dan memiliki hampir tidak ada masalah dengan Injection sql.
Mungkin berguna bagi mereka yang mencari pertanyaan serupa jadi saya taruh di sini untuk digunakan
untuk digunakan (contoh):
dan koneksi saya:
Catatan:
Solusi ini membantu Anda menjalankan beberapa pernyataan bersama-sama,
Jika terjadi pernyataan yang salah, itu tidak mengeksekusi pernyataan lain
sumber
Mencoba kode berikut
Kemudian
Dan mendapatkan
Jika ditambahkan
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setelah$db = ...
Lalu mendapat halaman kosong
Jika malah
SELECT
dicobaDELETE
, maka dalam kedua kasus tersebut mendapat error sepertiJadi kesimpulan saya bahwa suntikan tidak mungkin ...
sumber
but you risk to be injected with multiple queries.
Jawaban saya tentang injeksiCoba fungsi ini: beberapa kueri dan beberapa nilai penyisipan.
sumber
PDO mendukung ini (per 2020). Lakukan saja panggilan query () pada objek PDO seperti biasa, pisahkan kueri dengan; dan kemudian nextRowset () untuk melangkah ke hasil SELECT berikutnya, jika Anda memiliki beberapa. Hasil akan memiliki urutan yang sama dengan kueri. Jelas pikirkan tentang implikasi keamanan - jadi jangan terima kueri yang disediakan pengguna, gunakan parameter, dll. Saya menggunakannya dengan kueri yang dihasilkan oleh kode misalnya.
sumber