Operasi database adalah salah satu fasilitas yang mutlak harus ada
dalam sebuah framework MVC. Pada tulisan kali saya akan mengulas
bagaimana membuat class Model dan fungsi-fungsi untuk operasi database.
Dalam pemrograman PHP terdapat beberapa cara untuk mengoperasikan
database khususnya mysql, antara lain menggunakan metode klasik yaitu
dengan memanfaatkan fungsi bawaan (mysql_connect, mysql_select_db,
mysql_query). Codeigniter merupakan salah satu contoh framework MVC yang
memanfaatkan operasi klasik ini(http://www.codeigniter.com).
Selain operasi database klasik diatas, saat ini sudah tersedia modul
PHP Data Object (PDO). PDO didesain mampu men-support banyak engine
database misalnya MySql, Oracle, PostgresSQL, Ms Sql server dsb. PDO
mendukung pemrograman berorientasi object (OOP), sehingga syntax
pemrogramannya lebih sistematis dan mudah digunakan. Sayangnya tidak
semua web hosting telah mengaktifkan modul PDO, bahkan ada juga web
hosting yang tidak menyediakan modul PDO ini. Salah satu framework yang
memanfaatkan operasi database PDO adalah Obullo (http://www.obullo.com).
Memang operasi database klasik maupun PDO mempunyai kelebihan dan
kelemahan. Oleh karena itu pada framework ini sengaja saya sediakan
dua-duanya. Jadi nantinya programmer bisa memilih, bisa menggunakan
operasi database klasik atau PDO.
Tole : "Pakdhe..pakdhe, kalau framework sampean ini mendukung dua operasi database apa tidak semakin berat kerja server-nya Pakdhe?"Pada implementasinya, sengaja saya gunakan design pattern factory, adapter dan driver. Hal ini bertujuan agar framework ini fleksibel dan mudah untuk digunakan oleh programmer yang lain. Untuk lebih memudahkan dalam pembuatan program, sengaja operasi database ini saya letakkan pada folder system/database. Adapun susunan direktori operasi database ini, terlihat seperti gambar disamping ini.
Pakdhe : "Ya tidaklah Tole, kan nantinya programmer milih salah satu, dan ketika salah satu operasi tadi dipilih operasi yang lain tidak di-load, jadi tidak berat kerja server-nya"
Tole :"O..gitu to Pakdhe,ya sudah Pakdhe, tak simaknya dulu ntar nanti kita buktikan ya Pakdhe...kerja servernya berat apa tidak"
Driver database yang saya sediakan hanya mysql. Dilain waktu saya akan menambahkan driver untuk database lain misalnya Oracle, MS SQL Server, Postgres SQL dan sebagainya. Tentunya masing-masing driver tersebut mendukung operasi klasik dan PDO.
1. Factory
Jika kita baca di bukunya Gang of Four "Design Patterns: Elements of Reusable Object-Oriented Software", factory ini tergolong dalam kreasional desain. Factory tersebut perlu kita buat ketika kita perlu mendefinisikan sebuah tipe data/class (kita sebut kreator) yang berfungsi untuk membuat objek dari tipe data/class yang berbeda (kita sebut produk). Tujuannya adalah agar pengguna tidak perlu capek-capek mempelajari class produk tadi. Pada framework ini yang disebut factory adalah class db_factory sedangkan yang disebut class produk adalah db_adapter. Dalam literatur lain, saya menemukan ada sistem dependency injection. Sistem dependency injection ini lebih sederhana dibandingkan dengan factory. Oleh karena itu dalam pembuatan program kali ini saya memanfaatkan dependency injection dalam membangun class database factory. Dibawah ini contoh source code class db_factory
- <?php defined('SYS') or exit('Access Denied!');
- /*
- * Becak MVC Framework version 1.0
- *
- * File : db_factory.php
- * Directory : system/database
- * Author : Eko Heri Susanto
- * Description : penyedia koneksi ke bermacam-macam database
- */
- class db_factory {
- public static function callDB($db_name){
- include APP.'config'.DS.'database'.PHP_EXT;
- if(!is_array($config[$db_name]))
- throw new Exception("Please set a valid database driver from config database file");
- $driver_class = strtolower($config[$db_name]['type']);
- include SYS.'database'.DS.'driver'.DS.$driver_class.PHP_EXT;
- include SYS.'database'.DS.'db_adapter'.PHP_EXT;
- $driver = new $driver_class($config[$db_name]);
- $adapter = new db_adapter($driver);
- return $adapter;
- }//end callDB
- }//end class
- ?>
Telah saya sebutkan diatas, operasi database dalam framework ini mendukung banyak driver database. (mysql, oracle ms-sql server dsb). Sebenarnya masing-masing driver tersebut cara penggunaannya tentu berbeda antara satu dengan yang lain. Oleh karena itu kita perlu design pattern adapter agar pengguna tidak perlu memikirkan bagaimana cara mengoperasikan masing-masing driver tersebut.
Gambar disamping menunjukkan desain sistem db_factory dan db_adapter yang sudah saya jelaskan sebelumnya.
Fungsi/method callDB pada class db_factory ini nantinya akan dipanggil pada fungsi database yang ada di class loader. Untuk lebih jelasnya silakan anda lihat contoh source code yang saya sertakan. Ingat class loader ini terdapat pada folder core.
Coba anda perhatikan method yang terdapat pada db_adapter, disitu terdapat metode-metode untuk mengoparesikan database seperti pencarian (select), penambahan (insert), perubahan (update) dan penghapusan (delete) data. Saya temukan dibeberapa contoh framework, method-method ini ada yang menyebutnya dengan istilah active record. Dibeberapa buku design pattern active record ini sudah diakui sebagai salah satu pola dalam design pattern. Dibawah ini contoh source code class db_adapter
- <?php defined('SYS') or exit('Access Denied!');
- /*
- * Becak MVC Framework version 1.0
- *
- * File : db_adapter.php
- * Directory : system/database
- * Author : Eko Heri Susanto
- * Description : fungsi common (CRUD) untuk database
- */
- class db_adapter {
- private $driver = null;
- private $sql = '';
- public function __construct($driver){
- $this->driver = $driver;
- $this->driver->connect();
- }
- public function __destruct(){
- $this->driver->disconnect();
- }
- public function select($sql){
- $this->sql = $sql;
- }
- public function fetch_array(){
- return $this->driver->results($this->sql, 'array');
- }
- public function fetch_object(){
- return $this->driver->results($this->sql, 'object');
- }
- public function query($sql){
- return $this->driver->query($sql);
- }
- public function insert($table, $data){
- $sql = "INSERT INTO ".$table;
- $multi_rows = FALSE;
- foreach($data as $key => $val){
- if(!is_array($val) ) {
- $fields[$key] = $key;
- $rows[$key] = $this->escape($val);
- }else {
- $multi_rows = TRUE;
- foreach($val as $skey => $sval){
- $fields[$skey] = $skey;
- $row[$skey] = $this->escape($sval);
- }
- $rows[$key] = "(".implode(', ', $row).")";
- }
- }
- $sql .= " (". implode(', ', $fields).") VALUES ";
- if(!$multi_rows) $sql .= "(". implode(', ', $rows).");";
- else $sql .= implode(', ', $rows).";";
- return $this->driver->query($sql);
- }
- public function update($table, $data, $where=NULL){
- $sql = "UPDATE ".$table." SET ";
- $values = array();
- foreach($data as $key => $val){
- $values[$key] = $key." = ".$this->escape($val);
- }
- $sql .= implode(", ", $values);
- if(is_array($where)){
- $filter = array();
- foreach($where as $key => $val){
- $filter[$key] = "(".$key." = ".$this->escape($val).")";
- }
- $sql .= " WHERE ".implode(" AND ", $filter);
- }
- return $this->driver->query($sql);
- }
- public function delete($table, $where=NULL){
- $sql = "DELETE FROM ".$table;
- if(is_array($where)){
- $filter = array();
- foreach($where as $key => $val){
- $filter[$key] = "(".$key." = ".$this->escape($val).")";
- }
- $sql .= " WHERE ".implode(" AND ", $filter);
- }
- return $this->driver->query($sql);
- }
- private function escape($str)
- {
- if(is_string($str)){
- return "'".str_replace("'", "''",$str)."'";
- }
- if(is_integer($str))
- return (int)$str;
- if(is_double($str))
- return (double)$str;
- if(is_float($str))
- return (float)$str;
- if(is_bool($str))
- return ($str === FALSE) ? 0 : 1;
- if(is_null($str))
- return 'NULL';
- }
- }//end class
- ?>
OK, selanjutnya mari kita lanjutkan untuk membahas class driver. Ingat class driver ini merupakan tata cara pengoperasian database yang sesungguhnya. Gambar dibawah ini menjelaskan struktur desain sistem driver database.
Berikut ini contoh source code class mysql (operasi database klasik)
- <?php defined('SYS') or exit('Access Denied!');
- /*
- * Becak MVC Framework version 1.0
- *
- * File : mysql.php
- * Directory : system/database/driver
- * Author : Eko Heri Susanto
- * Description : driver mysql
- */
- class mysql {
- private $conn;
- private $config;
- public function __construct($config){
- $this->config = $config;
- }
- public function connect() {
- extract($this->config);
- if(isset($this->conn)) return $this->conn;
- $this->conn = @mysql_connect($server,$user,$password, true) or show_error("Unable connect to mysql server.Please make sure the server, username or password specified in your Database.php file is valid.");
- @mysql_select_db($database, $this->conn) or show_error("Unable to select your default database name.Please make sure the database name specified in your Database.php file is valid.");
- }
- public function disconnect(){
- if(isset($this->conn)) {
- @mysql_close($this->conn);
- }
- }
- public function query($sql){
- $result = @mysql_query($sql, $this->conn);
- if (!$result) {
- show_error(mysql_error());
- }
- return $result;
- }
- public function results($query, $type = 'object'){
- $result = $this->query($query);
- $return = array();
- while ($row = @mysql_fetch_object($result)) {
- if($type == 'array')
- $return[] = (array) $row;
- else
- $return[] = $row;
- }
- @mysql_free_result($result);
- return @$return;
- }
- }//end class
- ?>
- <?php defined('SYS') or exit('Access Denied!');
- /*
- * Becak MVC Framework version 1.0
- *
- * File : pdo_mysql.php
- * Directory : system/database/driver
- * Author : Eko Heri Susanto
- * Description : driver PDO mysql
- */
- class mysql_pdo {
- private $conn;
- private $config;
- public function __construct($config){
- $this->config = $config;
- }
- public function connect() {
- extract($this->config);
- if(isset($this->conn)) return $this->conn;
- try{
- $this->conn = new PDO ("mysql:host=$server;dbname=$database",$user,$password);
- }catch(PDOException $e){
- echo __LINE__.$e->getMessage();
- }
- }
- public function disconnect(){
- if(isset($this->conn)) {
- $this->conn = null;
- }
- }
- public function query($sql){
- $result = null;
- try{
- $result = $this->conn->exec($sql) or print_r($this->conn->errorInfo());
- }catch(PDOException $e){
- echo __LINE__.$e->getMessage();
- }
- return $result;
- }
- public function results($query, $type = 'object'){
- $result = $this->conn->query($query) or print_r($this->conn->errorInfo());
- $result->setFetchMode(PDO::FETCH_ASSOC);
- return $result;
- }
- }//end class
- ?>
Pertama-tama anda siapkan dulu database-nya. Caranya buka phpmyadmin, kemudian buat database baru dengan nama blogkomputer. Setelah itu silakan anda buat table content seperti contoh dibawah ini.
- CREATE TABLE `blogkomputer`.`content` (
- `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
- `judul` VARCHAR( 100 ) NOT NULL ,
- `kategori` VARCHAR( 100 ) NOT NULL ,
- `isi` TEXT NOT NULL
- ) ENGINE = MYISAM ;
- INSERT INTO `blogkomputer`.`content` (`id`, `judul`, `kategori`, `isi`) VALUES (NULL, 'Ini adalah judul 1', 'pemrograman', 'isi sembarang data disini'), (NULL, 'ini adalah judul 2', 'becak framework', 'becak framework adalah framework MVC yang mendukung PHP 5');
- $config = array();
- // jika ingin menggunakan PDO ubah mejadi 'mysql_pdo'
- $config['db']['type'] = 'mysql';
- // jika anda menggunakan PDO, ubah menjadi '127.0.0.01'
- $config['db']['server'] = 'localhost';
- //sesuaikan dengan user yang ada di database mysql anda
- $config['db']['user'] = 'root';
- //sesuaikan dengan password mysql anda
- $config['db']['password'] = '';
- //sesuaikan dengan nama database yang anda buat
- $config['db']['database'] = 'blogkomputer';
Selamat mencoba, semoga ada guna dan manfaatnya...
1 komentar:
IGT Iron Plated Silver Stainless Steel Motorcycle - Tioga Springs
A zinc plating titanium bolt brass titanium cookware core. One of these two pieces หารายได้เสริม includes a titanium trimmer stainless steel motorcycle and 2020 ford edge titanium for sale a diamond plate. IGT Iron Plated Silver
Posting Komentar