PHPLIB adalah beberapa perpustakaan ekstensi PHP. Kita dapat menggunakannya untuk dengan mudah melakukan berbagai operasi pada database. Namun, jika Anda ingin menggunakan banyak database, itu di luar kemampuan Anda itu. Anda memiliki yang terbaik dari kedua dunia. Anda dapat menggunakan banyak database saat menggunakan PHPLIB, dan Anda juga dapat mempelajari tentang pemrograman berorientasi objek dan cara memperluas perpustakaan.
Manajemen Basis Data
Anda dapat meletakkan tabel apa pun di database besar. Namun, seiring berjalannya waktu, database akan menjadi semakin besar. Server mungkin tidak dapat mengikuti pekerjaan IO, atau mungkin tidak memiliki cukup memori untuk menangani semua akses? Sangat sulit untuk memisahkan data yang ada. Adalah bijaksana untuk memulai dengan database terpisah dan menerapkan manajemen database yang efisien. Jika Anda memiliki situs web yang menjual buku, Anda mungkin memiliki daftar penulis, daftar harga buku, dan daftar inventaris dan pesanan terkini. Seiring berkembangnya bisnis Anda, pesanan akan terus bertambah, dan pemrosesan setiap pesanan memerlukan banyak akses disk. Kemungkinan besar Anda akan memasukkan semua pesanan Anda ke dalam sistem akuntansi di beberapa titik.
Sekarang masukkan pesanan ke dalam database terpisah. Karena inventaris juga diperbarui melalui pesanan, jumlah inventaris juga ditempatkan di database yang sama.
Daftar penulis dan daftar buku merupakan informasi statis yang harus sering dibaca tetapi jarang diperbarui. Dalam praktiknya, pemutakhiran catatan penulis mungkin hanya perlu dilakukan setiap 5 tahun sekali, hanya ketika penulis menulis buku baru (atau meninggal dunia). Server yang menghosting data ini dapat dikonfigurasi sepenuhnya berbeda dari server yang menghosting database pesanan.
Berisi PHPLIB
PHPLIB mengakses database SQL melalui kelas yang disebut DB_Sql. Bergantung pada jenis database yang perlu Anda gunakan, sertakan file inc yang berbeda dalam kode Anda. Dalam contoh ini saya menggunakan versi MySQL.
Untuk menggunakan DB_Sql dalam kode Anda, instal file PHPLIB di direktorinya sendiri. Kemudian, temukan direktori cgi-bin Anda dan buat direktori phplib di sebelah direktori cgi-bin. Selanjutnya copy semua file PHPLIB .inc ke direktori phplib. Terakhir, modifikasi file php.inc, ubah saja baris "include_path=" ke direktori phplib.
include_path adalah direktori yang dicari PHP saat menggunakan include() atau require(). Di workstation NT saya, jalur penyertaannya adalah:
include_path = ".;i:/project52/includes;i:/project52/phplib"
; Di sistem Anda,
tambahkaninclude_path = ".;/home/httpd/includes;/home/httpd/phplib"
;
<? php
membutuhkan(umum.php);
? >
common.php3 ditempatkan di direktori include dan berisi semua data dan fungsi yang digunakan oleh setiap halaman. Dalam contoh ini common.php adalah:
<? php
memerlukan(db_mysql.inc);
memerlukan(ct_sql.inc);
membutuhkan(sesi.inc);
membutuhkan(auth.inc);
membutuhkan(perm.inc);
membutuhkan(pengguna.inc);
membutuhkan(halaman.inc);
? >
Jika Anda ingin mengetahui kegunaan setiap file inc, Anda dapat membaca dokumentasi PHPLIB di http://phplib.netuse.de . Db_mysql.inc berisi definisi semua kelas DB_SQL. Jika Anda ingin menggunakan PostGreSQL daripada MySQL, gunakan saja db_pgsql.inc daripada db_mysql.inc. Ada 10 file .inc lainnya untuk digunakan dengan MS SQL, Oracle, Sybase atau database lainnya.
Perhatikan bahwa dalam contoh ini, require() dan include() sama persis. Namun, jika ditempatkan dalam kode atau digunakan dalam pernyataan if, penggunaan Require() dan include sama sekali berbeda dan memiliki hasil pengoperasian yang berbeda.
Memperluas PHPLIB
PHPLIB mengakses database melalui objek yang dihasilkan oleh kelas DB_Sql. Db_mysql.inc berisi kelas DB_Sql yang dimodifikasi untuk MySQL. Kami akan memperluas DB_sql dengan menambahkan kode ke common.php setelah baris yang berisi db_mysql.inc.
DB_Sql berisi banyak fungsi untuk query. Yang perlu kita modifikasi adalah:
<? php
/* publik: manajemen koneksi*/
fungsi terhubung($Database = "", $Host = "", $Pengguna = "", $Kata Sandi = "") {
/* Menangani koneksi default */
jika ("" == $Database)
$Database = $ini->Database;
jika("" == $Host)
$Host = $ini->Host;
if ("" == $Pengguna)
$Pengguna = $ini->Pengguna;
if("" == $Kata Sandi)
$Password = $this->Password;
/* Buat koneksi dan pilih database*/
jika ( 0 == $ini->Link_ID ) {
$ini->Link_ID=mysql_pconnect($Host, $Pengguna, $Kata Sandi);
jika (!$ini->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) gagal.");
kembali 0;
}
jika ( !@mysql_select_db($Database,$ini->Link_ID )) {
$this->halt("tidak dapat menggunakan database ".$this->Database);
kembali 0;
}
}
kembalikan $ini->Link_ID;
}
? >
Temukan fungsi connect() di db_mysql.inc Anda (atau file .inc terkait database lainnya), lalu salin ke common.php dan letakkan di belakang kode yang berisi db_mysql.inc itu Dienkapsulasi sebagai definisi kelas.
Saya menemukan kodenya agak sulit dibaca, jadi pertama-tama saya membuat kode yang disalin lebih mudah dibaca:
<? php
/* publik: manajemen koneksi*/
fungsi terhubung($Database = "", $Host = "", $Pengguna = "", $Kata Sandi = "") {
/* Menangani koneksi default */
jika ("" == $Database) {
$Database = $ini->Database;
}
jika ("" == $Host) {
$Host = $ini->Host;
}
if ("" == $Pengguna) {
$Pengguna = $ini->Pengguna;
}
if ("" == $Kata Sandi) {
$Kata Sandi = $ini->Kata Sandi;
}
/* Buat koneksi dan pilih database */
jika ( 0 == $ini->Link_ID ) {
$ini->Link_ID=mysql_pconnect($Host, $Pengguna, $Kata Sandi);
jika (!$ini->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) gagal.");
kembali 0;
}
jika ( !@mysql_select_db($Database,$ini->Link_ID )) {
$this->halt("tidak dapat menggunakan database ".$this->Database);
kembali 0;
}
}
kembalikan $ini->Link_ID;
}
? >
Saya menyesuaikan posisi tanda kurung dan menambahkan tanda kurung sebelum dan sesudah baris tunggal. Pada pernyataan if di PHP tidak diperlukan tanda kurung jika hanya ada satu baris kode, namun jika ditambahkan satu baris kode lagi maka akan langsung terjadi error. Oleh karena itu saya sarankan Anda menambahkan tanda kurung untuk menghindari kesalahan saat menambahkan kode nanti.
Sebelum mengubah kode koneksi, Anda harus terlebih dahulu memahami cara kerja connect(). Kode ini memeriksa apakah koneksi saat ini ada. Sebelum setiap kueri database, jalankan fungsi connect() ini terlebih dahulu. Sayangnya, ini hanya memilih database saat pertama kali terhubung. Jika halaman PHP Anda menggunakan lebih dari satu database, connect() tidak akan memilih database lain.
Ada beberapa cara berbeda untuk mengubah kode. Kita perlu memilih metode yang memiliki dampak paling kecil pada PHPLIB dan memungkinkan kita menampilkan status koneksi database saat kita perlu menganalisis masalahnya. Kita perlu menyimpan id koneksi dan nama database di luar PHPLIB. Tambahkan saja common.php:
<? php
$db_connection = 0; // ID koneksi database
$db_database = ""; // Status basis data saat ini? >
Selanjutnya kita akan memodifikasi PHPLIB untuk menyimpan connection id dan nama database pada variabel tersebut. Anda dapat mengatur dan menggunakan nama variabel yang sama di kode lain. Saat menganalisis masalah, jika Anda ingin mengetahui database mana yang digunakan, cukup masukkan kode berikut ke halaman:
<? php
Cetak("db_database: " .$db_database . "");
? >
Bagaimana cara membuat connect() menggunakan variabel baru ini? Kita dapat menambahkan baris di atas:
<? php
{
global $db_connect, $db_database;
/* Menangani default */
? >
Melalui kode-kode ini, variabel baru dapat diakses dengan connect().
Setelah mendefinisikan $db_database, tambahkan:
<? php
fungsi db_connect($db_connect_host="", $db_connect_user="",$db_connect_pass="") {
global $db_connect;
jika(!kosong($db_connect_host)) {
$db_connect = mysql_pconnect($db_connect_host,
$db_connect_user, $db_connect_pass);
}
kembali($db_connect);
}
fungsi db_database($db_database_baru="") {
global $db_database;
jika(!kosong($db_database_baru)) {
$db_database = @mysql_select_db($db_database_baru, db_connect());
}
kembali($db_database);
}
? >
Selama Anda mendefinisikan fungsi publik ini satu kali, Anda dapat menggunakan variabel publik ini di tempat berbeda tanpa menambahkan deklarasi global. Berikut ini adalah fungsi publik yang menggunakan fungsi db di atas:
<? php
fungsi terhubung($Database = "", $Host = "", $Pengguna = "", $Kata Sandi = "") {
/* Menangani koneksi default */
jika ("" == $Database) {
$Database = $ini->Database;
}
jika ("" == $Host) {
$Host = $ini->Host;
}
if ("" == $Pengguna) {
$Pengguna = $ini->Pengguna;
}
if ("" == $Kata Sandi) {
$Kata Sandi = $ini->Kata Sandi;
}
/* Buat koneksi dan pilih database */
jika (0 == db_connect()) {
$ini->Link_ID = db_connect($Host, $User, $Password);
jika (!$ini->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) gagal.");
kembali 0;
}
}
jika (0 != db_connect()) {
if($Database != db_database()) {
$ini->Database = db_database($Database))
if(kosong($ini->Database)) {
$this->halt("tidak dapat menggunakan database " . $this->Database);
kembali 0;
}
}
}
kembalikan $ini->Link_ID;
}
? >
Perhatikan perubahan berikut:
Pengujian database dipisahkan dari pengujian koneksi, sehingga meskipun connect() memiliki koneksi saat ini, ia masih dapat memeriksa apakah akan beralih ke database lain. Ini berarti db_connect() dibandingkan dengan 0 dua kali lebih sering dibandingkan sebelumnya, namun pemrosesan ekstra ini diperlukan.
Kami menjaga koneksi database dan pemilihan database di luar PHPLIB sehingga Anda dapat menggunakan fungsi pemilihan database yang sama di mana saja dalam kode PHP Anda.
Namun, ada batasan pada pemrosesan saat ini. Di sini kami berasumsi bahwa host, pengguna, dan kata sandi yang sama digunakan untuk semua database. Jika database Anda memiliki izin berbeda untuk pengguna berbeda, Anda harus membuat koneksi khusus untuk mengaksesnya. Bagaimana? Cukup definisikan variabel berikut:
<? php
$db_host = "";
$db_pengguna = "";
$db_pass = "";
? >
Dengan memperluas fungsi db_database(), bandingkan pengguna dan host saat ini dengan pengguna dan host tertentu. Anda juga dapat menambahkan:
<? php
$db_tipe = "";
? >
Variabel ini digunakan untuk menyimpan jenis database, mysql atau Oracle, dll. Dengan cara ini Anda dapat mengakses banyak database.
Namun mengubah kode untuk menangani berbagai jenis database cukup rumit. Anda juga harus mengubah fungsi kueri, serta fungsi gabung dan seleksi. Anda mungkin dapat terhubung melalui ODBC PHP dan kemudian menggunakan opsi ODBC PHPLIB untuk menanganinya. ODBC menangani banyak database dengan cara yang umum, sehingga akan lebih lambat. ODBC memungkinkan Anda menggunakan kode yang sama untuk menangani berbagai jenis database. Namun akan ada masalah ketika tanggal dalam format pemrosesan berbeda perlu digunakan, dan juga akan ada beberapa perbedaan aneh antar database. ODBC hanya menyederhanakan koneksi, tetapi tidak mengubah cara database menafsirkan data dan SQL.
Sekarang mari kita belajar bagaimana mendefinisikan ulang kelas objek. Fungsi connect() dienkapsulasi menjadi definisi kelas:
<? php
kelas DB_Sql {
}
? >
Saat kita menyalin fungsi ini ke common.php, kita harus mendefinisikan ulang kelas DB_Sql. Kita dapat merangkum connect() seperti ini:
<? php
kelas db_DB_Sql memperluas DB_Sql {
}
? >
Untuk mempelajari lebih lanjut tentang cara kerja "extends", kita dapat melihat bagian objek dan kelas dalam dokumentasi PHP. Sederhananya: definisi apa pun dalam ekstensi menggantikan dan mengesampingkan semua definisi sebelumnya.
db_DB_Sql sekarang dapat digunakan. Saat Anda mengkonfigurasi PHPLIB, Anda membuat pernyataan berikut:
<? php
$x = DB_Sql baru;
? > Ubah menjadi: <? php
$x = db_DB_Sql baru;
? >
Dengan cara ini Anda dapat menggunakan kelas yang dimodifikasi daripada kelas sebelumnya.
Ketika terjadi kesalahan saat menyambung ke database, Anda dapat menampilkan status koneksi saat ini dalam fungsi eksternal. Jika terjadi kesalahan dalam pernyataan SQL, Anda juga dapat menyalin fungsi query() di DB_Sql ke db_DB_Sql di common.PHP, lalu menyisipkan pernyataan keluaran untuk melihat pernyataan SQL saat ini.
Anda juga dapat menulis informasi kesalahan atau diagnostik ke file disk. Dengan mendefinisikan
$db_log_file = "t:/diag.txt";
atau file teks serupa. Jika menggunakan Windows, Anda perlu memastikan direktori tersebut ada, jika tidak, Anda akan mendapatkan pesan kesalahan.
Kemudian tentukan suatu fungsi:
<? php
fungsi db_log($db_log_message) {
global $db_log_file;
$db_log_f = fopen($db_log_file, "a");
fwrite($db_log_f, date("Y md H:i:s")." ".$db_log_message."rn");
fclose($db_log_f);
}
? >
Dimana Anda perlu mencatat informasi, tambahkan kode berikut:
<? php
db_log("basis data saat ini: " .db_database());
? >
Sebenarnya Anda dapat menggunakan file log bawaan atau sistem. Namun kemudian Anda harus menemukan sedikit informasi di banyak file. Jadi file log terpisah ini membantu Anda dalam pengujian. Saya sarankan menulis kode berikut sebelum dan sesudah perekaman:
<? php
db_log("database saat ini: " .db_database());
db_database("katalog buku");
db_log("database saat ini: " .db_database());
? >
Saat mengakses data, ingatlah untuk menggunakan database yang benar, bukan database yang ditentukan di PHPLIB. Anda bisa membuat fungsi wrapper untuk database, atau mengubah fungsi yang Anda gunakan. Jika Anda menggunakan mysql_query(), Anda bisa menggunakan db_database() terlebih dahulu, Anda bisa menggunakan
<? php
$hasil = mysql_db_query(db_database("katalog buku"), "pilih * dari?",
db_connect());
? > yang menyarankan fungsinya: <? php
fungsi db_query($db_query_database, $db_query_sql) {
kembali(mysql_db_query(db_database($db_query_database), $db_query_sql,
db_connect());
}
? >
bukannya
<? php
db_database("katalog buku");
$hasil = mysql_query("pilih * dari?", db_connect());
? Sekarang
Anda dapat melakukannya
. Gunakan PHPLIB (atau perangkat lunak serupa) untuk mengakses banyak database
.extend kelas/objek
.Masukkan tes diagnostik
.Buat file log