Catatan pelajaran PHPPDO lib.culog.cn 13 November 2007 09:36 Penulis: Liu Shui Meng Chun [Besar, Sedang, Kecil]
■Apa itu PDO?
Ekstensi POD (Objek Data PHP) ditambahkan di PHP5. Di PHP6, PDO akan digunakan secara default untuk terhubung ke database. Semua ekstensi non-PDO akan dihapus dari ekstensi di PHP6. Ekstensi ini menyediakan PDO kelas bawaan PHP untuk mengakses database. Database yang berbeda menggunakan nama metode yang sama untuk memecahkan masalah koneksi database yang tidak konsisten.
Saya mengkonfigurasinya untuk pengembangan di bawah windows.
■Tujuan PDO adalah menyediakan API yang ringan, jelas, dan nyaman yang menyatukan fitur-fitur umum dari berbagai perpustakaan RDBMS, namun tidak mengecualikan fitur-fitur yang lebih canggih. Memberikan tingkat abstraksi/kompatibilitas opsional yang lebih tinggi melalui skrip PHP.
■Fitur PDO:
pertunjukan. PDO belajar dari awal tentang keberhasilan dan kegagalan penskalaan database yang ada. Karena kode PDO masih baru, kami memiliki kesempatan untuk mendesain ulang kinerja dari awal untuk memanfaatkan fitur-fitur terbaru PHP 5. kemampuan. PDO dirancang untuk menyediakan fungsionalitas database umum sebagai landasan sekaligus menyediakan akses mudah ke fitur unik RDBMS. Sederhana. PDO dirancang untuk memudahkan Anda bekerja dengan database. API tidak memaksa masuk ke dalam kode Anda dan memperjelas fungsi setiap pemanggilan fungsi. Dapat diperluas saat runtime. Ekstensi PDO bersifat modular, memungkinkan Anda memuat driver untuk backend database Anda saat runtime tanpa harus mengkompilasi ulang atau menginstal ulang seluruh program PHP. Misalnya, ekstensi PDO_OCI mengimplementasikan API database Oracle, bukan ekstensi PDO. Ada juga driver untuk MySQL, PostgreSQL, ODBC, dan Firebird, dan masih banyak lagi yang sedang dikembangkan.
■Instal PDO
Apa yang saya miliki di sini adalah ekstensi PDO untuk pengembangan di WINDOWS. Jika Anda ingin menginstal dan mengkonfigurasinya di Linux, silakan cari di tempat lain.
Persyaratan versi:
Itu sudah termasuk dalam paket program php5.1 dan versi yang lebih baru;
Untuk php5.0.x, Anda perlu mendownloadnya dari pecl.php.net dan meletakkannya di perpustakaan ekstensi Anda, yang merupakan folder ext dari folder tempat PHP berada;
Manual mengatakan bahwa versi sebelum 5.0 tidak dapat menjalankan ekstensi PDO.
Konfigurasi:
Ubah file konfigurasi php.ini Anda agar mendukung pdo (Jika Anda tidak memahami php.ini, ketahui dulu bahwa Anda perlu mengubah php.ini yang ditampilkan saat memanggil fungsi phpinfo() Anda)
Bundel
Hapus tanda titik koma di depan extension=php_pdo.dll. Tanda titik koma adalah simbol komentar file konfigurasi php.
ada lagi
;ekstensi=php_pdo.dll
;ekstensi=php_pdo_firebird.dll
;ekstensi=php_pdo_informix.dll
;ekstensi=php_pdo_mssql.dll
;ekstensi=php_pdo_mysql.dll
;ekstensi=php_pdo_oci.dll
;ekstensi=php_pdo_oci8.dll
;ekstensi=php_pdo_odbc.dll
;ekstensi=php_pdo_pgsql.dll
;ekstensi=php_pdo_sqlite.dll
Basis data yang sesuai dengan setiap ekstensi adalah:
Nama driverDatabase yang didukungPDO_DBLIBFreeTDS / Microsoft SQL Server / SybasePDO_FIREBIRDFirebird/Interbase 6PDO_INFORMIXIBM Informix Dynamic ServerPDO_MYSQLMySQL 3.x/4.xPDO_OCIOracle Call InterfacePDO_ODBCODBC v3 (IBM DB2, unixODBC dan win32)PDO_PGSQLPostgreSQLPDO_S QLITESQLite 3 dan SQLite 2
Database mana yang ingin Anda gunakan, masukkan saja yang sesuai Hapus saja simbol komentar ";" sebelum perluasan.
■Menggunakan PDO
Saya berasumsi di sini Anda telah menginstal mysql. Jika belum, silakan cari cara untuk menginstalnya terlebih dahulu. Milik saya adalah mysql5.0.22, dan orang lain yang menggunakan MySQL 4.0.26 juga dapat menggunakannya.
★Koneksi basis data:
Kami menggunakan contoh berikut untuk menganalisis database koneksi PDO,
<?php
$dbms='mysql'; //Jenis database Oracle menggunakan ODI. Untuk pengembang, jika Anda menggunakan database yang berbeda, Anda hanya perlu mengubahnya, dan Anda tidak perlu mengingat banyak fungsi.
$host='localhost';//Nama host basis data
$dbName='tes'; //Database digunakan
$user='root'; //Nama pengguna koneksi database
$pass=''; //Kata sandi yang sesuai
$dsn="$dbms:host=$host;namadb=$namadb";
//
mencoba{
$dbh=newPDO($dsn,$user,$pass);//Menginisialisasi objek PDO berarti membuat objek koneksi database $dbh
echo "Koneksi berhasil<br/>";
/*Anda juga dapat melakukan operasi pencarian
foreach($dbh->query('SELECT * from FOO')as$row){
print_r($row);//Anda dapat menggunakan echo($GLOBAL);
}
*/
$dbh=batal;
}menangkap(PDOException$e){
die("Kesalahan!: ".$e->getMessage()."<br/>");
}
//Secara default, ini bukan koneksi yang panjang. Jika Anda memerlukan koneksi yang panjang ke database, Anda perlu menambahkan parameter di akhir: array(PDO::ATTR_PERSISTENT => true).
$db=newPDO($dsn,$user,$pass,array(PDO::ATTR_PERSISTENT=>benar)
?>
★Permintaan basis data:
Kami telah melakukan kueri di atas, dan kami juga dapat menggunakan kueri berikut:
<?php
$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER); //Atur atribut
$rs=$db->query("PILIH * DARI foo");
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_arr=$rs->fetchAll();
print_r($hasil_arr);
?>
Karena metode setAttribute() digunakan di atas, kedua parameter dimasukkan untuk memaksa nama bidang menjadi huruf besar. Berikut ini adalah parameter PDO::setAttribute():
PDO::ATTR_CASE: Memaksa nama kolom dalam format, seperti detail di bawah (parameter kedua):
PDO::CASE_LOWER: Memaksa nama kolom menjadi huruf
kecil : :CASE_NATURAL: Nama kolom mengikuti cara aslinya
PDO::CASE_UPPER: Memaksa nama kolom menjadi huruf besar.
PDO::ATTR_ERRMODE: Pesan kesalahan
PDO::ERRMODE_SILENT: Tidak menampilkan informasi kesalahan, hanya kode kesalahan.
PDO::
ERRMODE_WARNING: Menampilkan kesalahan peringatan.
PDO::ATTR_ORACLE_NULLS (berlaku tidak hanya untuk ORACLE, tetapi juga untuk database lain): ) menentukan nilai yang sesuai di php untuk nilai NULL yang dikembalikan oleh database.
PDO::NULL_NATURAL: tidak berubah.
PDO::NULL_EMPTY_STRING: String kosong diubah menjadi NULL.
PDO::NULL_TO_STRING: NULL diubah menjadi string kosong.
PDO::
ATTR_STRINGIFY_FETCHES
: Mengonversi nilai numerik menjadi string saat mengambil. Membutuhkan bool
))
PDO::ATTR_AUTOCOMMIT(tersedia di OCI, Firebird dan MySQL): Apakah akan melakukan autocommit setiap pernyataan.
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(tersedia di MySQL): Gunakan kueri buffer.
$rs->setFetchMode(PDO::FETCH_ASSOC); dalam contohnya adalah PDOStatement::setFetchMode(), sebuah deklarasi tipe kembalian.
Ada sebagai berikut:
PDO::FETCH_ASSOC-- bentuk array asosiatif
PDO::FETCH_NUM -- Bentuk array indeks numerik
PDO::FETCH_BOTH -- Keduanya tersedia dalam bentuk array, yang merupakan default
PDO::FETCH_OBJ -- dalam bentuk objek, mirip dengan mysql_fetch_object() sebelumnya. Untuk
deklarasi tipe pengembalian lebih lanjut (PDOStatement::nama metode), lihat manual.
★Masukkan, perbarui, hapus data,
$db->exec("HAPUS DARI `xxxx_menu` di mana pertengahan=43");
Untuk meringkas secara singkat operasi di atas:
Operasi kueri utamanya adalah PDO::query(), PDO::exec(), PDO::prepare().
PDO::query() terutama digunakan untuk operasi yang mengembalikan hasil yang direkam, terutama operasi SELECT.
PDO::exec() terutama untuk operasi yang tidak mengembalikan kumpulan hasil, seperti INSERT, UPDATE, DELETE, dan operasi lainnya. Hasil yang dikembalikan adalah jumlah kolom yang terpengaruh oleh operasi saat ini.
PDO::prepare() pada dasarnya adalah operasi prapemrosesan. Anda perlu menggunakan $rs->execute() untuk mengeksekusi pernyataan SQL dalam prapemrosesan. Metode ini dapat mengikat parameter dan cukup kuat . Semua Orang Anda dapat merujuk ke manual dan dokumentasi lainnya.
Operasi utama untuk mendapatkan kumpulan hasil adalah: PDOStatement::fetchColumn(), PDOStatement::fetch(), PDOStatement::fetchALL().
PDOStatement::fetchColumn() adalah bidang rekaman pertama yang ditentukan dalam hasil pengambilan.
PDOStatement::fetch() digunakan untuk mendapatkan catatan.
PDOStatement::fetchAll() adalah untuk menyatukan semua kumpulan data menjadi satu. Untuk mendapatkan hasilnya, Anda dapat mengatur jenis kumpulan hasil yang diperlukan melalui PDOStatement::setFetchMode.
Ada juga dua operasi di sekitarnya, satu adalah PDO::lastInsertId() dan PDOStatement::rowCount(). PDO::lastInsertId() mengembalikan operasi penyisipan terakhir, dan jenis kolom kunci utama adalah ID kenaikan otomatis terakhir.
PDOStatement::rowCount() terutama digunakan untuk kumpulan hasil yang dipengaruhi oleh operasi DELETE, INSERT, dan UPDATE dari PDO::query() dan PDO::prepare(), dan tidak valid untuk metode PDO::exec() dan operasi SELECT.
★Transaksi dan pengiriman otomatis
Pada titik ini, Anda telah terhubung ke mysql melalui PDO. Sebelum mengeluarkan pertanyaan, Anda harus memahami bagaimana PDO mengelola transaksi. Jika Anda belum pernah bertransaksi sebelumnya, Anda harus mengetahui terlebih dahulu empat ciri transaksi: Atomicity, Consistency, Isolation dan Durability yaitu ACID. Dalam istilah awam, untuk setiap pekerjaan yang dilakukan dalam suatu transaksi, meskipun dilakukan secara bertahap, terdapat jaminan bahwa pekerjaan tersebut akan diterapkan dengan aman ke database dan tidak akan terpengaruh oleh permintaan dari koneksi lain saat pekerjaan tersebut sedang diserahkan. . pengaruh. Pekerjaan transaksional dapat dibatalkan secara otomatis berdasarkan permintaan (dengan asumsi Anda belum mengkomitnya), yang membuat penanganan kesalahan dalam skrip menjadi lebih mudah.
Transaksi biasanya dilaksanakan dengan mengumpulkan sejumlah perubahan dan menjadikannya efektif pada saat yang bersamaan. Keuntungannya adalah dapat meningkatkan efisiensi pembaruan ini secara signifikan. Dengan kata lain, transaksi dapat membuat skrip lebih cepat dan berpotensi lebih kuat (walaupun transaksi harus digunakan dengan benar untuk mendapatkan manfaat tersebut).
Sayangnya, tidak semua database mendukung transaksi (Mysql5 mendukung transaksi, mysql4 saya tidak tahu), jadi ketika koneksi pertama kali dibuka, PDO perlu dijalankan dalam mode "komit otomatis". Mode komitmen otomatis berarti jika database mendukung transaksi, maka setiap kueri yang Anda jalankan memiliki transaksi implisitnya sendiri, dan jika database tidak mendukung transaksi, setiap kueri tidak memiliki transaksi tersebut. Jika Anda memerlukan transaksi, Anda harus menggunakan metode PDO::beginTransaction() untuk memulai transaksi. Jika driver yang mendasarinya tidak mendukung transaksi, PDOException akan dilempar (terlepas dari pengaturan penanganan kesalahan: ini selalu merupakan kondisi kesalahan fatal). Dalam suatu transaksi, Anda dapat menggunakan PDO::commit() atau PDO::rollBack() untuk mengakhiri transaksi, bergantung pada apakah kode yang dijalankan dalam transaksi berhasil.
Ketika skrip berakhir, atau ketika koneksi akan ditutup, jika ada transaksi yang belum diselesaikan, PDO akan secara otomatis mengembalikan transaksi tersebut. Ini adalah langkah keamanan untuk membantu menghindari inkonsistensi jika skrip berakhir tidak normal - jika transaksi tidak dilakukan secara eksplisit, maka diasumsikan akan ada inkonsistensi di suatu tempat, sehingga rollback akan dilakukan untuk menjaga keamanan data.
//Contoh dari http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505furlong/index.html
mencoba{
$dbh=PDO baru('odbc:SAMPEL','db2inst1','ibmdb2',
array(PDO_ATTR_PERSISTENT=>benar));
echo"Tersambungn";
$dbh->setAttribute(PDO_ATTR_ERRMODE,PDO_ERRMODE_EXCEPTION);
$dbh->mulaiTransaksi();
$dbh->exec("masukkan ke nilai staf (id, pertama, terakhir) (23, 'Joe', 'Bloggs')");
$dbh->exec("masukkan ke dalam gajiperubahan (id, jumlah, perubahan)
nilai (23, 50000, SEKARANG())");
$dbh->melakukan();
}menangkap(Pengecualian $e){
$dbh->rollBack();
echo"Gagal: ".$e->getMessage();
}
Pada contoh di atas, misalkan kita membuat sekumpulan entri untuk karyawan baru dengan nomor ID, yaitu 23. Selain memasukkan data dasar orang tersebut, kita juga perlu mencatat gaji karyawan tersebut. Melakukan kedua pembaruan secara terpisah sangatlah mudah, namun dengan menyertakan kedua pembaruan dalam panggilan BeginTransaction() dan commit(), Anda memastikan bahwa tidak ada orang lain yang dapat melihat perubahan hingga perubahan selesai. Jika terjadi kesalahan, blok catch dapat mengembalikan semua perubahan yang terjadi sejak awal transaksi dan mencetak pesan kesalahan.
Pembaruan tidak harus dilakukan dalam suatu transaksi. Anda juga dapat mengeluarkan kueri kompleks untuk mengekstrak data dan membuat pembaruan dan kueri lebih lanjut menggunakan informasi tersebut. Ketika suatu transaksi aktif, dijamin orang lain tidak dapat melakukan perubahan selama pekerjaan sedang berlangsung. Sebenarnya ini tidak 100% benar, tapi ini merupakan pengenalan yang baik jika Anda belum pernah mendengar tentang transaksi sebelumnya.
★Pernyataan yang telah disiapkan dan prosedur tersimpan Banyak database yang lebih matang mendukung konsep pernyataan yang telah disiapkan. Apa saja pernyataan yang telah disiapkan? Anda dapat menganggap pernyataan yang telah disiapkan sebagai templat terkompilasi dari SQL yang ingin Anda jalankan, yang dapat dikustomisasi menggunakan parameter variabel. Pernyataan yang telah disiapkan memberikan dua manfaat utama:
kueri hanya perlu diurai (atau disiapkan) satu kali, namun dapat dieksekusi beberapa kali dengan parameter yang sama atau berbeda. Ketika kueri sudah siap, database menganalisis, mengkompilasi, dan mengoptimalkan rencana untuk mengeksekusi kueri. Proses ini memakan waktu lebih lama untuk kueri yang kompleks dan dapat memperlambat aplikasi Anda secara signifikan jika Anda perlu mengulangi kueri yang sama beberapa kali dengan parameter berbeda. Dengan menggunakan pernyataan yang telah disiapkan, Anda dapat menghindari siklus analisis/kompilasi/optimasi yang berulang. Sederhananya, pernyataan yang disiapkan menggunakan sumber daya yang lebih sedikit sehingga berjalan lebih cepat.
Parameter yang diberikan pada pernyataan yang disiapkan tidak perlu diapit tanda kutip; Jika aplikasi Anda hanya menggunakan pernyataan yang telah disiapkan, Anda dapat yakin bahwa tidak ada intrusi SQL yang dapat terjadi. (Namun, masih ada risiko jika Anda masih mendasarkan bagian lain dari kueri pada masukan yang tidak tepercaya).
Pernyataan yang telah disiapkan sangat berguna sehingga PDO sebenarnya melanggar aturan yang ditetapkan dalam Sasaran 4: Jika pengemudi tidak mendukung pernyataan yang telah disiapkan, PDO akan meniru pernyataan yang telah disiapkan.
Contoh: Contoh aplikasi PDO:
<?php
$dbms='mysql';//Jenis database Oracle menggunakan ODI. Untuk pengembang, menggunakan database yang berbeda, selama Anda mengubahnya, Anda tidak perlu mengingat begitu banyak fungsi.
$host='localhost';//Database nama host
$dbName='test';//Database digunakan
$user='root';//Nama pengguna koneksi database
$pass='';//Kata sandi yang sesuai
$dsn="$dbms:host=$host;dbname= $dbNama";
kelasdbextendsPDO{
fungsi publik__konstruksi(){
mencoba{
parent::__construct("$GLOBALS[dsn]",$GLOBALS['pengguna'],$GLOBALS['lulus']);
}menangkap(PDOException$e){
die("Kesalahan: ".$e->__toString()."<br/>");
}
}
publicfinalfunctionquery($sql){
mencoba{
returnparent::query($ini->setString($sql));
}menangkap(PDOException$e){
die("Kesalahan: ".$e->__toString()."<br/>");
}
}
privatefinalfunctionsetString($sql){
echo "Saya ingin memproses $sql";
kembali$sql;
}
}
$db=db baru();
$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER);
foreach($db->query('PILIH * dari xxxx_menu')sebagai$baris){
print_r($baris);
}
$db->exec('HAPUS DARI `xxxx_menu` di mana pertengahan=43');
?>