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):

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:

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:

$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:

$transaction=$connection->beginTransaction(); try { $connection->createCommand($sql1)->execute(); $connection->createCommand($sql2)->execute(); //.... eksekusi SQL lain $transaction->commit(); } catch(Exception $e) // eksepsi 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 }