Rumah  >  Soal Jawab  >  teks badan

php - PDO和PDOStatement为什么会同时存在?这样的设计是出于什么考虑呢?

问题描述:
都知道自PHP 5.1.0 起,PDO就算是PHP的标配的一部分了,PDO提供了3个类PDOPDOStatementPDOExceptionPDOException这个类就不用说了,功能和定位啥的看名字都很清楚。

那么问题来了:为什么会同时存在PDOPDOStatement这两个类?

为什么会有这样的疑问,先看下图(图片截取自@PHP官网手册):

图片是PDOPDOStatement类所声明的方法,可以看出,这两个类提供的方法虽然绝大部分不同,但是明显核心方法有重叠或重复,比如:

PDOStatement::execute()还好说,而PDO::query()PDO::exec() 同时存在的必要性又是什么呢?而且还会造成使用和理解上面的不畅。

好吧,就算有同时存在的必要性
那么还是有一点为什么要同时存在这两个类呢?而不是一个类(假如只有 PDO类)就将这两个类所能做的事情一起做了呢?
PDO 类和 PDOStatement 类之间是什么关系呢?

如果 PDO 类用来执行SQL和管理链接,而 PDOStatement 类只用来处理结果集,那么感觉就舒服顺畅多了。

希望有大牛能给予解释 PHPPDO 这么设计的考虑是什么,真诚感谢~

我想大声告诉你我想大声告诉你2712 hari yang lalu744

membalas semua(3)saya akan balas

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-16 13:13:25

    Pemahaman saya ialah satu digunakan untuk melaksanakan SQL biasa, dan satu lagi boleh digunakan untuk pengikatan parameter dan sebagainya...

    balas
    0
  • 仅有的幸福

    仅有的幸福2017-05-16 13:13:25

    Saya akan beritahu pemahaman peribadi saya jika ada kesilapan.
    First tengok kelas PDO

    PDO::prepare — Prepares a statement for execution and returns a statement object
    PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object

    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.

    balas
    0
  • PHP中文网

    PHP中文网2017-05-16 13:13:25

    1.exec
    2.query
    3.prepare+execute

    Ketiga-tiga kaedah di atas semuanya boleh melaksanakan SQL Jika anda mendapati ia mengelirukan, anda hanya boleh menggunakan kaedah ketiga.
    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();

    Jika anda melaksanakan SQL dengan parameter input, untuk mengelakkan suntikan SQL, anda harus menggunakan prepare:🎜
    $sql = "SELECT * FROM `io_post` WHERE `id` IN (?, ?, ?)";
    $params = array(1, 3, 5); //$params是一个参数数组,元素按顺序一一对应$sql中的问号?占位符
    $stmt = $db->prepare($sql);
    $stmt->execute($params); //execute会自动对参数数组的每个元素进行bindValue
    $stmt->fetchAll(); //如SELECT结果集
    $stmt->rowCount(); //如INSERT/UPDATE/DELETE受影响的行

    balas
    0
  • Batalbalas