Penerangan masalah:
Seperti yang kita semua tahu, PDO telah menjadi bahagian standard PHP sejak PHP 5.1.0 menyediakan 3 kelas: PDO
, PDOStatement code> dan
PDOException
, PDOException
tidak perlu disebutkan Fungsi dan kedudukannya sangat jelas dari namanya.
Kemudian persoalan timbul: Mengapa dua kelas PDO
dan PDOStatement
wujud pada masa yang sama?
Mengapa terdapat soalan sedemikian? Mula-mula lihat gambar di bawah (gambar diambil daripada manual laman web rasmi @PHP):
Gambar menunjukkan kaedah yang diisytiharkan oleh kelas PDO
dan PDOStatement
Ia boleh dilihat bahawa walaupun kebanyakan kaedah yang disediakan oleh kedua-dua kelas ini adalah berbeza, intinya kaedah jelas bertindih atau berulang, seperti:
PDO::query()
, PDO::exec()
kedua-duanya melaksanakan pernyataan SQL, tetapi pulangannya berbeza
PDOStatement::execute()
juga melaksanakan pernyataan SQL, tetapi pernyataan itu telah dipraproses
PDOStatement::execute()
tidak mengapa, tetapi PDO::query()
dan PDO::exec()
wujud di masa yang sama Apakah keperluan? Ia juga akan menyebabkan kesukaran dalam penggunaan dan pemahaman.
Nah, walaupun terdapat keperluan untuk wujud pada masa yang sama
maka masih ada satu titikMengapa kedua-dua kelas ini wujud pada masa yang sama? Daripada satu kelas (jika terdapat hanya kelas PDO
), bagaimana pula dengan melakukan perkara yang boleh dilakukan oleh kedua-dua kelas ini bersama-sama?
Apakah hubungan antara kelas PDO
dan kelas PDOStatement
?
Jika kelas PDO
digunakan untuk melaksanakan SQL dan mengurus sambungan, dan kelas PDOStatement
hanya digunakan untuk memproses set hasil, maka ia berasa lebih selesa dan lancar .
Saya harap seseorang boleh menerangkan pertimbangan reka bentuk PHP
's PDO
Terima kasih yang ikhlas~
Pemahaman saya ialah satu digunakan untuk melaksanakan SQL biasa, dan satu lagi boleh digunakan untuk pengikatan parameter dan sebagainya...
Saya akan beritahu pemahaman peribadi saya jika ada kesilapan.
First tengok kelas PDO
Anda boleh melihat bahawa kedua-dua query() dan prepare() mengembalikan objek PDOStatement, yang bermaksud bahawa PDOStatement boleh mengendalikan set hasil.
Melihat PDO::prepare sekali lagi, manual mengatakan bahawa ia melaksanakan pernyataan yang disediakan Malah, ia mendapat pernyataan PDOStatement yang disediakan, dan kemudian benar-benar melaksanakan SQL dengan memanggil PDOStatement::execute().
Biasanya beberapa projek kami menggunakan persediaan untuk melaksanakan pernyataan SQL Pendekatan ini adalah untuk menghalang suntikan SQL dan meningkatkan prestasi pertanyaan SQL templat yang sama Kandungan manual rasmi diperkenalkan:
Pertanyaan hanya perlu dihuraikan (atau disediakan). sekali, tetapi boleh dilaksanakan berbilang kali dengan parameter yang sama atau berbeza Apabila pertanyaan disediakan, pangkalan data akan menganalisis, menyusun dan mengoptimumkan rancangannya untuk melaksanakan pertanyaan Untuk pertanyaan kompleks, proses ini boleh mengambil masa yang cukup memperlahankan aplikasi jika terdapat keperluan untuk mengulangi pertanyaan yang sama berkali-kali dengan parameter yang berbeza Dengan menggunakan pernyataan yang disediakan, aplikasi mengelak daripada mengulangi kitaran analisis/kompil/optimumkan Ini bermakna pernyataan yang disediakan menggunakan lebih sedikit sumber dan dengan itu berjalan lebih cepat .
Parameter untuk penyata yang disediakan tidak perlu dipetik secara automatik oleh pemacu jika aplikasi menggunakan penyata yang disediakan secara eksklusif, pembangun boleh yakin bahawa tiada suntikan SQL akan berlaku (namun, jika bahagian lain daripadanya. pertanyaan sedang dibina dengan input yang tidak dilepaskan, suntikan SQL masih boleh dilakukan).Mengenai apa yang dikatakan oleh poster tentang perbezaan antara PDO::query dan PDO::exec, seperti berikut:
query hanya melaksanakan penyataan pilih dan laksanakan melaksanakan pilih, masukkan, kemas kini, padam
PDO::query melaksanakan pernyataan SQL, dan jika diluluskan, mengembalikan objek PDOStatement
PDO::exec melaksanakan pernyataan SQL dan mengembalikan bilangan baris yang terjejas. Fungsi ini tidak mengembalikan koleksi hasil.
PDOStatement::execute telah diperkenalkan sebelum ini Ia adalah sub-fungsi di bawah PDOStatement Satu ciri ialah ia menyokong parameter pengikatan tanpa mengambil kira isu keselamatan suntikan SQL prestasi.
Jika anda hanya menanyakan satu pernyataan, kelebihan menggunakan pertanyaan ialah set hasil yang dikembalikan melalui pertanyaan boleh dilalui terus.
Jika anda menggunakan exec untuk melaksanakannya, ia hanya akan mengembalikan bilangan baris yang terjejas, bukan set hasil PDOStatement Anda tidak boleh melintasinya secara langsung. Ikut cadangan rasmi untuk menggunakan pertanyaan atau melaksanakan.
Ini kira-kira apa yang saya faham.
Ketiga-tiga kaedah di atas semuanya boleh melaksanakan SQL Jika anda mendapati ia mengelirukan, anda hanya boleh menggunakan kaedah ketiga.
Jika anda melaksanakan SQL dengan parameter input, untuk mengelakkan suntikan SQL, anda harus menggunakan prepare:🎜Kerana selagi exec dan query boleh mencapainya, prepare+execute juga boleh mencapainya.
Dan prepare+execute boleh. mencapainya. , seperti pra-pemprosesan pertanyaan berparameter, exec dan pertanyaan tidak boleh dilaksanakan
Exec dan pertanyaan akan lebih mudah. ringkas, jelas exec lebih sesuai untuk melaksanakan satu operasi tulis (INSERT/UPDATE/DELETE) pernyataan, kerana exec boleh terus mengembalikan baris yang terjejas Jika anda menggunakan pertanyaan, anda perlu memanggil rowCount() untuk mendapatkan baris yang terjejas, seperti sebagai :
$db->query($sql)->rowCount();
$db->query($sql)->rowCount();
当如果你执行没有外来参数的SQL获取SELECT结果,这时则应该用query而不是exec:
$db->query($sql)->fetchAll();
Apabila anda melaksanakan SQL tanpa parameter luaran untuk mendapatkan hasil SELECT, anda harus menggunakan pertanyaan dan bukannya exec:$db->query($sql)->fetchAll();