Rabu, 14 November 2012

Banyak kelebihan yang diberikan dari pemrograman berorientasi objek atau OOP. Salah satunya adalah reusable, dimana kode php yang ditulis dapat digunakan kembali, tanpa harus menulis kembali kode php untuk melakukan hal yang sama. Tutorial PHP OOP: Save Edit Delete & Menampilkan Data dengan OOP ini akan dibahas cara menyimpan, menampilkan, mengedit, dan menghapus data menggunakan konsep OOP.

Membuka Koneksi ke Database dengan OOP

Hal pertama yang harus dilakukan sebelum bisa menyimpan data adalah membuka koneksi ke database. Untuk membuka koneksi ke database dengan php, cukuplah mudah. Misal, bisa menggunakan kode sederhana di bawah:
  1. $koneksi = mysql_connect("localhost","root",""); //host, user, password
  2. mysql_select_db("db_test", $koneksi);
Jika kode ini langsung diubah kedalam konsep OOP, maka akan seperti:
  1. class Connect {
  2. public static function getConnection(){
  3. $koneksi = mysql_connect("localhost","root",""); //host, user, password
  4. mysql_select_db("db_test", $koneksi);
  5. return $koneksi;
  6. }
  7. }
Namun bukan cara ini yang akan digunakan, karena pada saat parameter koneksi seperti host, user database dan password berubah maka class ini harus diubah atau diedit sesuai dengan parameter yang baru. Hal itu bertentangan dengan Open/Closed Principle dimana class terbuka untuk ekstensi/inheritance tapi tertutup untuk modifikasi. Class yang sudah selesai ditulis hanya terbuka untuk modifikasi untuk perbaikan error.

File Konfigurasi

Jadi apa yang diperlukan agar bisa mengubah parameter koneksi? sebuah file konfigurasi. Dalam tutorial ini akan digunakan sebuah file config.ini untuk menyimpan semua konfigurasi. Pertama buatlah file dengan nama config.ini dan tulis konfigurasi berikut:
  1. ;database configuration
  2. dbhost="localhost"
  3. dbuser="root"
  4. dbpassword="blah"
  5. dbname="test"
Pada saat parameter koneksi berubah file config.ini lah yang diubah tanpa perlu mengedit class Connect yang dibuat.

Membaca File Konfigurasi dengan Class Config

Langkah selanjutnya, dibutuhkan sebuah class untuk membaca konfigurasi, maka buatlah sebuah file Config.php dan class Config sebagai berikut.
  1. <?php
  2.  
  3. class Config {
  4.  
  5. protected static $_config = array();
  6.  
  7. public static function getConfig($key){
  8. if(!self::$_config){
  9. $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'config.ini';
  10. $config = parse_ini_file($filename);
  11. if(false === $config){
  12. throw new Exception('Gagal membaca file konfigurasi');
  13. }
  14. self::$_config = $config;
  15. }
  16.  
  17. if(isset(self::$_config[$key])){
  18. return self::$_config[$key];
  19. }
  20. }
  21. }
Berikut penjelesan singkat dari fungsi getConfig() di atas. Cek apakah parameter $_config masih kosong (file config.ini belum pernah dibaca), jika kosong maka baca file config.ini menggunakan fungsi parse_ini_file dan simpan hasilnya di properti $_config -- baris ke-8 sampai 15. Setelah file config.ini dibaca, cari nilai konfigurasi sesuai dengan parameter $key (baris ke-17).

Class Connect

Setelah membuat file konfigurasi config.ini kemudian membaca konfigurasi menggunakan class Config. Sekarang saatnya membuka koneksi ke database menggunakan class Connect. Buatlah file Connect.php dan class Connect di bawah:
  1. <?php
  2.  
  3. include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Config.php';
  4.  
  5. class Connect {
  6.  
  7. protected static $_connection;
  8.  
  9. public static function getConnection(){
  10. if(!self::$_connection){
  11. $dbhost = Config::getConfig('dbhost');
  12. $dbuser = Config::getConfig('dbuser');
  13. $dbpassword = Config::getConfig('dbpassword');
  14. $dbname = Config::getConfig('dbname');
  15. self::$_connection = @mysql_connect($dbhost, $dbuser, $dbpassword);
  16. if(!self::$_connection){
  17. throw new Exception('Gagal melalukan koneksi ke database. '.mysql_error());
  18. }
  19. $result = @mysql_select_db($dbname, self::$_connection);
  20. if(!$result){
  21. throw new Exception('Koneksi gagal: '.mysql_error());
  22. }
  23. }
  24. return self::$_connection;
  25. }
  26.  
  27. public static function close(){
  28. if(self::$_connection){
  29. mysql_close(self::$_connection);
  30. }
  31. }
  32. }
Fungsi getConnection() di atas pertama-tama mengecek apakah sudah ada koneksi terbuka, jika belum maka konfigurasi dibaca dan koneksi baru ke database dibuat.

Menyimpan Data dengan Konsep OOP

Sebelum mulai membuat kode OOP untuk menyimpan data, terlebih dahulu kita akan mempelajari bagaimana proses penyimpanan data. Jika ada sebuah lemari penyimpanan seperti gambar dibawah:
Untitled%2520drawing.png
Maka kita akan menaruh pensil di kotak pensil, pulpen di kotak pulpen. Secara sederhana seperti itulah proses menyimpan data ke database. Jika ada tabeluser seperti berikut:
KolomTipe Data
user_idvarchar(50)
namavarchar(100)
passwordvarchar(50)
tipevarchar(20)
maka perlu dilakukan hal yang sama seperti kotak penyimpanan di atas. user_id disimpan di kolom user_idnama di kolom nama, dan seterusnya. Bagaimana melakukan hal ini dengan kode php? menggunakan associated array, seperti:
  1. 'user_id' => 'admin',
  2. 'nama' => 'Administrator',
  3. 'password' => '123123',
  4. 'tipe' => 'USER'
  5. )
bagian kiri tanda => adalah kolom tabel dan bagian kanan adalah nilai yang akan disimpan.
Lalu apa hubungannya dengan kode menyimpan data yang akan dibuat? Mengetahui cara menggunakan kode simpan tersebut dan mengetahui parameter inputan yang digunakan yaitu associated array. Berikut adalah cara membuat kode menyimpan data menggunakan konsep OOP.

Buatlah file Table.php lalu include file Connect.php dan deklarasikan class Table

  1. <?php
  2.  
  3. include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Connect.php';
  4.  
  5. class Table {

Tambahkan property $_tableName untuk menyimpan nama tabel dan buat konstruktor class

  1. <?php
  2.  
  3. include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Connect.php';
  4.  
  5. class Table {
  6.  
  7. protected $_tableName;
  8.  
  9. function __construct($tableName){ // konstruktor
  10. $this->_tableName = $tableName;
  11. }

Buat fungsi connect() dan close() untuk membuka dan menutup koneksi ke database. Dan deklarasikan fungsi save().

  1. //.......kode sebelumnya ...........
  2. public function connect(){
  3. return Connect::getConnection();
  4. }
  5.  
  6. public function close(){
  7. Connect::close();
  8. }
  9.  
  10. function save(array $data){ //inisialisai fungsi save

dengan fungsi save akan dibuat sebuah sql insert dengan format kurang lebih seperti
INSERT INTO `nama_tabel` SET `nama_kolom1`='nilai 1', `nama_kolom2`='nilai 2';.

Buat kode sql untuk bagian warna merah

  1. // ... kode sebelumnya ........
  2. function save(array $data){
  3. $sql = "UPDATE `".$this->_tableName."` SET"; // sql bagian warna merah

buat kode sql bagian bagian warna hijau dan sambungkan dengan dengan bagian warna merah

  1. // ... kode sebelumnya ........
  2. foreach($data as $field => $value){ //sql bagian warna hijau
  3. $sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
  4. }
  5. $sql = rtrim($sql, ','); // hilangkan kelebihan tanda koma ,

simpan data menggunakan fungsi mysql_query dan throw Exception jika gagal menyimpan data.

  1. // ... kode sebelumnya ........
  2. $result = mysql_query($sql, Connect::getConnection());
  3. if(!$result){
  4. throw new Exception('Gagal menyimpan data ke table '.$this->_tableName.': '.mysql_error());
  5. }
  6. } // akhir fungsi save
  7. } // akhir class Tabel

Jika potongan kode di atas digabungkan maka akan menjadi:

  1. <?php
  2.  
  3. include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Connect.php';
  4.  
  5. class Table {
  6.  
  7. protected $_tableName;
  8.  
  9. function __construct($tableName){
  10. $this->_tableName = $tableName;
  11. }
  12.  
  13. public function connect(){
  14. return Connect::getConnection();
  15. }
  16.  
  17. public function close(){
  18. Connect::close();
  19. }
  20.  
  21. function save(array $data){
  22. $sql = "INSERT INTO `".$this->_tableName."` SET";
  23. foreach($data as $field => $value){
  24. $sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
  25. }
  26. $sql = rtrim($sql, ',');
  27. $result = mysql_query($sql, Connect::getConnection());
  28. if(!$result){
  29. throw new Exception('Gagal menyimpan data ke table '.$this->_tableName.': '.mysql_error());
  30. }
  31. }
  32. }

Bagaimana cara menggunakan class Tabel di atas untuk menyimpan data, contoh:
  1. include 'Tabel.php';
  2. $table = new Tabel('user'); // user adalah nama tabel
  3. $table->connect();
  4. $table->save(array(
  5. 'user_id' => 'admin',
  6. 'nama' => 'Admin',
  7. 'password' => '123456',
  8. 'tipe' => 'USER'
  9. ));
  10. $table->close();

Edit Data Menggunakan Konsep OOP

Langkah langkah untuk membuat kode edit data dengan konsep OOP hampir sama dengan simpan data di atas. Fungsi update() yang akan dibuat digunakan untuk membentuk sql kurang lebih seperti:
UPDATE `nama_tabel` SET `nama_kolom1`='nilai 1', `nama_kolom2`='nilai 2' WHERE `nama_kolom1` = 'test';.

Buka kembali file Tabel.php dan tambahkan fungsi update() dan buat sql bagian warna merah.

  1. // ....... kode sebelumnya.......
  2. function update(array $data, $where = ''){
  3. $sql = "UPDATE `".$this->_tableName."` SET"; // sql bagian warna merah

buat sql bagian warna hijau dan sambung dengan sql bagian warna merah

  1. // ......... kode sebelumnya .........
  2. foreach($data as $field => $value){ // sql bagian hijau
  3. $sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
  4. }
  5. $sql = rtrim($sql, ','); // hilangkan kelebihan tanda koma ,

buat sql warna biru jika parameter $where tidak kosong

  1. //.......... kode sebelumnya........
  2. if($where){
  3. $sql .= " WHERE ".$where; // sql bagian warna biru
  4. }

edit data menggunakan fungsi mysql_query dan throw Exception jika proses edit data gagal

  1. //........ kode sebelumny ..........
  2. $result = mysql_query($sql, Connect::getConnection());
  3. if(!$result){
  4. throw new Exception('Gagal mengupdate data table '.$this->_tableName.': '.mysql_error());
  5. }
  6. }

jika digabungkan akan menjadi seperti berikut:

  1. //....... kode sebelumnya .........
  2. function update(array $data, $where = ''){
  3. $sql = "UPDATE `".$this->_tableName."` SET";
  4. foreach($data as $field => $value){
  5. $sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
  6. }
  7. $sql = rtrim($sql, ',');
  8. if($where){
  9. $sql .= " WHERE ".$where;
  10. }
  11. $result = mysql_query($sql, Connect::getConnection());
  12. if(!$result){
  13. throw new Exception('Gagal mengupdate data table '.$this->_tableName.': '.mysql_error());
  14. }
  15. }

Cara menggunakan fungsi update di atas sangat mudah, contoh:
  1. <?php
  2. include 'Table.php';
  3. $tabel = new Tabel('user');
  4. $tabel->connect();
  5. $data = array(
  6. 'nama' => 'Administrator',
  7. 'password' => '123123'
  8. );
  9. $tabel->update($data, "user_id='admin'");
  10. $tabel->close();

Delete Data dengan Konsep OOP

Jika menghapus data dari sebuah tabel database maka digunakan sql query kurang lebih seperti:
DELETE FROM `nama_tabel` WHERE `nama_kolom`='test'
Untuk membuat kode php untuk menghapus data dengan konsep OOP, sql bagian merah akan menjadi parameter inputan dari fungsi delete() di bawah.
  1. //....... kode sebelumnya .........
  2. function delete($where = ''){
  3. $sql = "DELETE FROM `".$this->_tableName."`";
  4. if($where){
  5. $sql .= " WHERE ".$where;
  6. }
  7. $result = mysql_query($sql, Connect::getConnection());
  8. if(!$result){
  9. throw new Exception('Gagal menghapus data dari table '.$this->_tableName.': '.mysql_error());
  10. }
  11. }
Tambahkan kode delete di atas ke class Tabel di file Tabel.php. Cara penggunaannya sebagai berikut:
  1. <?php
  2. include 'Tabel.php';
  3. $tabel = new Tabel('user');
  4. $tabel->connect();
  5. $table->delete("user_id='admin'");
  6. $table->close();

Menampilkan Data dengan Konsep OOP

Menampilkan data dari sebuah tabel database bisa menggunakan fungsi mysql_fetch_array, mysql_fetch_assoc, atau mysql_fetch_object. Sesuai dengan bahasa tutorial ini, maka fungsi yang sesuai adalah mysql_fetch_object karena fungsi mysql_fetch_object re-return sebuah object. Apakah itu pilihan yang tepat? Coba perhatikan kode menampilkan data berikut:
  1. <?php
  2. $conn = mysql_connect("localhost", "root", "");
  3. mysql_select_db("test", $conn);
  4. $sql = "select * from `user`";
  5. $rs = mysql_query($sql);
  6. while($user = mysql_fetch_object($rs)){
  7. echo $user->nama;
  8. }
kode di atas terlihat sederhana, tapi setiap kali menampilkan data tabel berbeda, harus menulis kode yang mirip berulang ulang kali. Lalu bagaimana cara mengubahnya menjadi berorientasi object? Di php ada sebuah interface standar yang disebut Iterator. Interface Iterator digunakan untuk mengakses atau memanipulasi sebuah array/list. Dengan mengimplementasikan interface Iterator maka class yang dibuat bisa digunakan dalam foreach seperti halnya array. Interface Iterator memiliki 5 fungsi di bawah yang perlu diimplementasikan.
Nama FungsiDeskripsi
rewind()mereset pointer array kembali 0 atau awal
current()me-return element dari pointer terkini
key()me-return pointer terkini
next()me-return element terkini dan memperbaharui pointer
valid()memvalidasi bahwa ada element dari pointer terkini

Sekarang buatlah file Select.php dan Class Select untuk mengimplementasikan fungsi interface Iterator di atas.
  1. <?php
  2.  
  3. include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Connect.php';
  4.  
  5. class Select implements Iterator{
  6.  
  7. protected $_query;
  8. protected $_sql;
  9. protected $_pointer = 0;
  10. protected $_numResult = 0;
  11. protected $_results = array();
  12.  
  13. function __construct($sql){
  14. $this->_sql = $sql;
  15. }
  16.  
  17. function rewind(){
  18. $this->_pointer = 0;
  19. }
  20.  
  21. function key(){
  22. return $this->_pointer;
  23. }
  24.  
  25. protected function _getQuery(){
  26. if(!$this->_query){
  27. $connection = Connect::getConnection();
  28. $this->_query = mysql_query($this->_sql, $connection);
  29. if(!$this->_query){
  30. throw new Exception('Gagal membaca data dari database:'.mysql_error());
  31. }
  32. }
  33. return $this->_query;
  34. }
  35.  
  36. protected function _getNumResult(){
  37. if(!$this->_numResult){
  38. $this->_numResult = mysql_num_rows($this->_getQuery());
  39. }
  40. return $this->_numResult;
  41. }
  42.  
  43. function valid(){
  44. if($this->_pointer >= 0 && $this->_pointer < $this->_getNumResult()){
  45. return true;
  46. }
  47. return false;
  48. }
  49.  
  50. protected function _getRow($pointer){
  51. if(isset($this->_results[$pointer])){
  52. return $this->_results[$pointer];
  53. }
  54. $row = mysql_fetch_object($this->_getQuery());
  55. if($row){
  56. $this->_results[$pointer] = $row;
  57. }
  58. return $row;
  59. }
  60.  
  61. function next(){
  62. $row = $this->_getRow($this->_pointer);
  63. if($row){
  64. $this->_pointer ++;
  65. }
  66. return $row;
  67. }
  68.  
  69. function current(){
  70. return $this->_getRow($this->_pointer);
  71. }
  72.  
  73. function close(){
  74. mysql_free_result($this->_getQuery());
  75. Connect::close();
  76. }
  77.  
  78. }

konstruktor dari class Select menerima inputan sebuah string sql query. Sql query inilah yang akan diproses untuk mengambil data ke tabel database.

Selanjutnya kembali ke class Tabel di file Tabel.php. Tambahkan fungsi findAll() untuk menampilkan seluruh data, dan fungsi findBy() untuk mencari/menampilkan data berdasarkan kolom tertentu.
  1. // ... kode class Tabel sebelumnya.......
  2. function findAll(){
  3. include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Select.php';
  4. $sql = "SELECT * FROM `".$this->_tableName."`";
  5. return new Select($sql);
  6. }
  7.  
  8. function findBy($field, $value){
  9. include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Select.php';
  10. $sql = "SELECT * FROM `".$this->_tableName."`";
  11. $sql .=" WHERE `".$field."`='".mysql_real_escape_string($value)."'";
  12. return new Select($sql);
  13. }

Jadi kode class Tabel selengkapnya adalah seperti di bawah.

  1. <?php
  2.  
  3. include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Connect.php';
  4.  
  5. class Table {
  6.  
  7. protected $_tableName;
  8.  
  9. function __construct($tableName){
  10. $this->_tableName = $tableName;
  11. }
  12.  
  13. public function connect(){
  14. return Connect::getConnection();
  15. }
  16.  
  17. public function close(){
  18. Connect::close();
  19. }
  20.  
  21. function save(array $data){
  22. $sql = "INSERT INTO `".$this->_tableName."` SET";
  23. foreach($data as $field => $value){
  24. $sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
  25. }
  26. $sql = rtrim($sql, ',');
  27. $result = mysql_query($sql, Connect::getConnection());
  28. if(!$result){
  29. throw new Exception('Gagal menyimpan data ke table '.$this->_tableName.': '.mysql_error());
  30. }
  31. }
  32.  
  33. function update(array $data, $where = ''){
  34. $sql = "UPDATE `".$this->_tableName."` SET";
  35. foreach($data as $field => $value){
  36. $sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
  37. }
  38. $sql = rtrim($sql, ',');
  39. if($where){
  40. $sql .= " WHERE ".$where;
  41. }
  42. $result = mysql_query($sql, Connect::getConnection());
  43. if(!$result){
  44. throw new Exception('Gagal mengupdate data table '.$this->_tableName.': '.mysql_error());
  45. }
  46. }
  47.  
  48. function delete($where = ''){
  49. $sql = "DELETE FROM `".$this->_tableName."`";
  50. if($where){
  51. $sql .= " WHERE ".$where;
  52. }
  53. $result = mysql_query($sql, Connect::getConnection());
  54. if(!$result){
  55. throw new Exception('Gagal menghapus data dari table '.$this->_tableName.': '.mysql_error());
  56. }
  57. }
  58.  
  59. function findAll(){
  60. include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Select.php';
  61. $sql = "SELECT * FROM `".$this->_tableName."`";
  62. return new Select($sql);
  63. }
  64.  
  65. function findBy($field, $value){
  66. include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Select.php';
  67. $sql = "SELECT * FROM `".$this->_tableName."`";
  68. $sql .=" WHERE `".$field."`='".mysql_real_escape_string($value)."'";
  69. return new Select($sql);
  70. }
  71. }

Lalu bagaimana cara menampilkan data dengan konsep OOP, seperti contoh berikut.
  1. <?php
  2. include_once '../Table.php';
  3.  
  4. $table = new Table('user');
  5. $users = $table->findAll();
  6. ?>
  7. <table border="1">
  8. <tr>
  9. <th>User Id</th>
  10. <th>Name</th>
  11. <th>Password</th>
  12. <th>Type</th>
  13. <th>Action</th>
  14. </tr>
  15. <?php foreach($users as $user){?>
  16. <tr>
  17. <td><?php echo $user->user_id;?>
  18. <td><?php echo $user->name;?></td>
  19. <td><?php echo $user->password?></td>
  20. <td><?php echo $user->type?></td>
  21. </tr>
  22. <?php }?>
  23. </table>
Sederhana sekali, hanya buat instant class Tabel dan panggil fungsi findAll() atau fungsi findBy().

Selamat Mencoba dan Berlatih CRUD OOP.
Load disqus comments

0 komentar