Data Access Object (DAO)
Obyek Akses Data atau Data Access Object (DAO) memisahkan data sumber daya antarmuka klien dari mekanisme akses datanya. Ia mengadaptasi API akses sumber daya ke antarmuka klien generik. Hasilnya, mekanisme akses data dapat diubah tersendiri atas kode yang menggunakan data.
Sejak versi 3.1, PRADO mulai menyediakan DAO yang adalah pelapis tipis sekitar PHP Data Objects (PDO). Meskipun PDO memiliki set fitur bagus dan API yang baik, kami memilih untuk mengimplementasikan PRADO DAO di atas PDO karena kelas PRADO DAO adalah kelas komponen dan bisa dikonfigurasi dalam aplikasi PRADO. Para pengguna dapat menggunakan kelas DAO ini dalam cara yang lebih disukai-PRADO.
Catatan:
Karena PRADO DAO didasarkan pada PDO, ekstensi PDO PHP perlu diinstalasi. Sebagai tambahan, anda perlu menginstalasi driver PDO database terkait untuk digunakan dalam aplikasi anda. Lihat lebih jelasnya dalam
PHP Manual.
PRADO DAO sebagian besar terdiri dari empat kelas (kebalikan dari PDO yang hanya dua kelas, PDO dan PDOStatement):
- TDbConnection - mewakili koneksi ke database.
- TDbCommand - mewakili pernyataan SQL yang dijalankan terhadap database.
- TDbDataReader - mewakili stream hanya-maju atas stream baris dari set hasil query.
- TDbTransaction - mewakili transaksi DB.
Berikutnya, kami memperkenalkan penggunaan PRADO DAO dalam skenario yang berbeda.
Menetapkan Koneksi Database
Untuk menetapkan koneksi database, seseorang membuat turunan TDbConnection dan mengaktifkannya. Nama sumber data (DSN) diperlukan guna menetapkan informasi yang dibutuhkan untuk menyambung ke database. Nama pengguna dan kata sandi database mungkin perlu disertakan untuk menetapkan koneksi.
$connection=new TDbConnection($dsn,$username,$password);
// panggil setAttribute() untuk mengirim parameter koneksi tambahan
// $connection->Persistent=true; // gunakan koneksi persisten
$connection->Active=true; // koneksi terlaksana
....
$connection->Active=false; // koneksi ditutup
Spesifikasi lengkap terhadap DSN dapat ditemukan dalam dokumentasi PDO. Di bawah ini adalah daftar format DNS paling umum dipakai:
- MySQL - mysql:host=localhost;dbname=test
- SQLite - sqlite:/path/to/dbfile
- ODBC - odbc:SAMPLE
Dalam hal terjadi kesalahan ketika menetapkan koneksi (seperti DSN atau nama pengguna/sandi salah), TDbException akan dimunculkan.
Menjalankan Pernyataan SQL
Sekali koneksi database terlaksana, pernyataan SQL dapat dijalankan melalui TDbCommand. Seseorang membuat TDbCommand dengan memanggil TDbConnection.createCommand() dengan pernyataan SQL yang ditetapkan:
$command=$connection->createCommand($sqlStatement);
// jika diperlukan, pernyataan SQL dapat dimutakhirkan seperti berikut:
$command->Text=$newSqlStatement;
Pernyataan SQL dijalankan melalui TDbCommand dalam salah satu dari dua cara berikut:
- execute() - melakukan pernyataan SQL non-query, seperti INSERT, UPDATE dan DELETE. Jika berhasil, ia mengembalikan jumlah baris yang dipengaruhi oleh eksekusi.
- query() - melakukan pernyataan SQL yang mengembalikan baris data, seperti SELECT. Jika berhasil, ia mengembalikan turunan TDbDataReader dari salah satu yang bisa mengambil hasil baris data.
$affectedRowCount=$command->execute(); // jalankan SQL non-query
$dataReader=$command->query(); // jalankan query SQL
$row=$command->queryRow(); // jalankan query SQL dan kembalikan hasil baris pertama
$value=$command->queryScalar(); // jalankan query SQL dan kembalikan nilai kolom pertama
Dalam hal terjadi kesalahan selama eksekusi pernyataan SQL, TDbException akan dimunculkan.
Mengambil Hasil Query
Setelah TDbCommand.query() membuat turunan TDbDataReader, seseorang dapat mengambil baris dari data hasil dengan memanggil TDbDataReader.read() secara berulang. Seseorang juga bisa menggunakan TDbDataReader dalam konstruksi bahasa PHP foreach untuk mengambil baris demi baris.
// memanggil read() secara berulang sampai ia mengembalikan false
while(($row=$dataReader->read())!==false) { ... }
// menggunakan foreach untuk menjelajah melalui setiap baris data
foreach($dataReader as $row) { ... }
// mengambil semua baris sekaligus dalam satu array tunggal
$rows=$dataReader->readAll();
Menggunakan Transaksi
Ketika aplikasi menjalankan beberapa query, setiap pembacaan dan/atau penulisan informasi dalam database, penting untuk memastikan bahwa datanase tidak dibiarkan dengan hanya beberapa query yang dibawanya. Transaksi, mewakili turunan TDbTransaksi dalam PRADO, dapat diinisialisasi dalam hal ini:
- Mulai transaksi.
- Jalankan query satu demi satu. Setiap memutakhirkan ke database tidak terlihat bagi dunia luar.
- Komit transaksi. Pemutakhiran menjadi terlihat jika transaksi berhasil.
- Jika salah satu query gagal, seluruh transaksi digulung kembali.
$transaction=$connection->beginTransaction();
try
{
$connection->createCommand($sql1)->execute();
$connection->createCommand($sql2)->execute();
//.... eksekusi SQL lain
$transaction->commit();
}
catch(Exception $e) // kekecualian dimunculkan jika query gagal
{
$transaction->rollBack();
}
Mengikat Parameter
Guna menghindari serangan injeksi SQL dan untuk meningkatkan performansi dari eksekusi pernyataan SQL yang dipakai secara berulang-ulang, seseorang dapat "menyiapkan" pernyataan SQL dengan tempat parameter opsional yang akan diganti dengan parameter sebenarnya selama proses pengikatan parameter.
Tempat parameter dapat bernama (diwakili dengan token unik) ataupun tidak bernama (diwakili dengan tanda tanya). Panggil TDbCommand.bindParameter() atau TDbCommand.bindValue() untuk mengganti tempat ini dengan parameter aktual. Parameter tidak perlu diberi tanda kutip: driver database melakukan ini bagi anda. Pengikatan parameter harus dikerjakan sebelum pernyataan SQL dijalankan.
// sebuah SQL dengan dua tempat ":username" dan ":email"
$sql="INSERT INTO users(username, email) VALUES(:username,:email)";
$command=$connection->createCommand($sql);
// ganti tempat ":username" dengan nilai username sebenarnya
$command->bindParameter(":username",$username,PDO::PARAM_STR);
// ganti tempat ":email" dengan nilai email sebenarnya
$command->bindParameter(":email",$email,PDO::PARAM_STR);
$command->execute();
// sisipkan baris lain dengan set parameter baru
$command->bindParameter(":username",$username2,PDO::PARAM_STR);
$command->bindParameter(":email",$email2,PDO::PARAM_STR);
$command->execute();
Metode bindParameter() dan bindValue() sangat mirip. Perbedaanya hanyalah pembentuk mengikat parameter dengan referensi variabel PHP sementara yang terkahir dengan nila. Untuk parameters yang mewakili blok memori data besar, pembentuk lebih disukai untuk pertimbangan performansi.
Untuk lebih jelasnya mengenai pengikatan parameter, lihat dokumentasi PHP terkait.
Mengikat Kolom
Ketika mengambil hasil query, seseorang dapat juga mengikat kolom dengan bariabel PHP agar dipopulasikan secara otomatis dengan data terbaru setiap kali baris diambil.
$sql="SELECT username, email FROM users";
$dataReader=$connection->createCommand($sql)->query();
// ikat kolom ke-1 (username) dengan variabel $username
$dataReader->bindColumn(1,$username);
// ikat kolom ke-2 (email) dengan variabel $email
$dataReader->bindColumn(2,$email);
while($dataReader->read()!==false)
{
// $username dan $email berisi username dan email dalam baris sekarang
}
$Id: DAO.page 2234 2007-09-23 14:27:54Z xue $