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:
$koneksi = mysql_connect("localhost","root",""); //host, user, password
mysql_select_db("db_test", $koneksi);
Jika kode ini langsung diubah kedalam konsep OOP, maka akan seperti:
class Connect {
public static function getConnection(){
$koneksi = mysql_connect("localhost","root",""); //host, user, password
mysql_select_db("db_test", $koneksi);
return $koneksi;
}
}
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:
;database configuration
dbhost="localhost"
dbuser="root"
dbpassword="blah"
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.
<?php
class Config {
protected static $_config = array();
public static function getConfig($key){
if(!self::$_config){
$filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'config.ini';
$config = parse_ini_file($filename);
if(false === $config){
throw new Exception('Gagal membaca file konfigurasi');
}
self::$_config = $config;
}
if(isset(self::$_config[$key])){
return self::$_config[$key];
}
}
}
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:
<?php
include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Config.php';
class Connect {
protected static $_connection;
public static function getConnection(){
if(!self::$_connection){
$dbhost = Config::getConfig('dbhost');
$dbuser = Config::getConfig('dbuser');
$dbpassword = Config::getConfig('dbpassword');
$dbname = Config::getConfig('dbname');
self::$_connection = @mysql_connect($dbhost, $dbuser, $dbpassword);
if(!self::$_connection){
throw new Exception('Gagal melalukan koneksi ke database. '.mysql_error());
}
$result = @mysql_select_db($dbname, self::$_connection);
if(!$result){
throw new Exception('Koneksi gagal: '.mysql_error());
}
}
return self::$_connection;
}
public static function close(){
if(self::$_connection){
mysql_close(self::$_connection);
}
}
}
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:

Maka kita akan menaruh pensil di kotak pensil, pulpen di kotak pulpen.
Secara sederhana seperti itulah proses menyimpan data ke database. Jika
ada tabel
user seperti berikut:
| Kolom |
Tipe Data |
| user_id |
varchar(50) |
| nama |
varchar(100) |
| password |
varchar(50) |
| tipe |
varchar(20) |
maka perlu dilakukan hal yang sama seperti kotak penyimpanan di atas.
user_id disimpan di kolom
user_id,
nama di kolom
nama, dan seterusnya. Bagaimana melakukan hal ini dengan kode php? menggunakan
associated array, seperti:
array(
'user_id' => 'admin',
'nama' => 'Administrator',
'password' => '123123',
'tipe' => 'USER'
)
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
<?php
include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Connect.php';
class Table {
Tambahkan property $_tableName untuk menyimpan nama tabel dan buat
konstruktor class
<?php
include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Connect.php';
class Table {
protected $_tableName;
function __construct($tableName){ // konstruktor
$this->_tableName = $tableName;
}
Buat fungsi connect() dan close() untuk membuka dan menutup koneksi ke database. Dan deklarasikan fungsi save().
//.......kode sebelumnya ...........
public function connect(){
return Connect::getConnection();
}
public function close(){
Connect::close();
}
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
// ... kode sebelumnya ........
function save(array $data){
$sql = "UPDATE `".$this->_tableName."` SET"; // sql bagian warna merah
buat kode sql bagian
bagian warna hijau dan sambungkan dengan dengan
bagian warna merah
// ... kode sebelumnya ........
foreach($data as $field => $value){ //sql bagian warna hijau
$sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
}
$sql = rtrim($sql, ','); // hilangkan kelebihan tanda koma ,
simpan data menggunakan fungsi mysql_query dan
throw Exception jika gagal menyimpan data.
// ... kode sebelumnya ........
$result = mysql_query($sql, Connect::getConnection());
if(!$result){
throw new Exception('Gagal menyimpan data ke table '.$this->_tableName.': '.mysql_error());
}
} // akhir fungsi save
} // akhir class Tabel
Jika potongan kode di atas digabungkan maka akan menjadi:
<?php
include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Connect.php';
class Table {
protected $_tableName;
function __construct($tableName){
$this->_tableName = $tableName;
}
public function connect(){
return Connect::getConnection();
}
public function close(){
Connect::close();
}
function save(array $data){
$sql = "INSERT INTO `".$this->_tableName."` SET";
foreach($data as $field => $value){
$sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
}
$sql = rtrim($sql, ',');
$result = mysql_query($sql, Connect::getConnection());
if(!$result){
throw new Exception('Gagal menyimpan data ke table '.$this->_tableName.': '.mysql_error());
}
}
}
Bagaimana cara menggunakan class Tabel di atas untuk menyimpan data, contoh:
include 'Tabel.php';
$table = new Tabel('user'); // user adalah nama tabel
$table->connect();
$table->save(array(
'user_id' => 'admin',
'nama' => 'Admin',
'password' => '123456',
'tipe' => 'USER'
));
$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.
// ....... kode sebelumnya.......
function update(array $data, $where = ''){
$sql = "UPDATE `".$this->_tableName."` SET"; // sql bagian warna merah
buat
sql bagian warna hijau dan sambung dengan
sql bagian warna merah
// ......... kode sebelumnya .........
foreach($data as $field => $value){ // sql bagian hijau
$sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
}
$sql = rtrim($sql, ','); // hilangkan kelebihan tanda koma ,
buat
sql warna biru jika parameter $where tidak kosong
//.......... kode sebelumnya........
if($where){
$sql .= " WHERE ".$where; // sql bagian warna biru
}
edit data menggunakan fungsi mysql_query dan throw Exception jika proses edit data gagal
//........ kode sebelumny ..........
$result = mysql_query($sql, Connect::getConnection());
if(!$result){
throw new Exception('Gagal mengupdate data table '.$this->_tableName.': '.mysql_error());
}
}
jika digabungkan akan menjadi seperti berikut:
//....... kode sebelumnya .........
function update(array $data, $where = ''){
$sql = "UPDATE `".$this->_tableName."` SET";
foreach($data as $field => $value){
$sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
}
$sql = rtrim($sql, ',');
if($where){
$sql .= " WHERE ".$where;
}
$result = mysql_query($sql, Connect::getConnection());
if(!$result){
throw new Exception('Gagal mengupdate data table '.$this->_tableName.': '.mysql_error());
}
}
Cara menggunakan fungsi update di atas sangat mudah, contoh:
<?php
include 'Table.php';
$tabel = new Tabel('user');
$tabel->connect();
$data = array(
'nama' => 'Administrator',
'password' => '123123'
);
$tabel->update($data, "user_id='admin'");
$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.
//....... kode sebelumnya .........
function delete($where = ''){
$sql = "DELETE FROM `".$this->_tableName."`";
if($where){
$sql .= " WHERE ".$where;
}
$result = mysql_query($sql, Connect::getConnection());
if(!$result){
throw new Exception('Gagal menghapus data dari table '.$this->_tableName.': '.mysql_error());
}
}
Tambahkan kode delete di atas ke class Tabel di file Tabel.php. Cara penggunaannya sebagai berikut:
<?php
include 'Tabel.php';
$tabel = new Tabel('user');
$tabel->connect();
$table->delete("user_id='admin'");
$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:
<?php
$conn = mysql_connect("localhost", "root", "");
mysql_select_db("test", $conn);
$sql = "select * from `user`";
$rs = mysql_query($sql);
while($user = mysql_fetch_object($rs)){
echo $user->nama;
}
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 Fungsi |
Deskripsi |
| 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.
<?php
include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Connect.php';
class Select implements Iterator{
protected $_query;
protected $_sql;
protected $_pointer = 0;
protected $_numResult = 0;
protected $_results = array();
function __construct($sql){
$this->_sql = $sql;
}
function rewind(){
$this->_pointer = 0;
}
function key(){
return $this->_pointer;
}
protected function _getQuery(){
if(!$this->_query){
$connection = Connect::getConnection();
$this->_query = mysql_query($this->_sql, $connection);
if(!$this->_query){
throw new Exception('Gagal membaca data dari database:'.mysql_error());
}
}
return $this->_query;
}
protected function _getNumResult(){
if(!$this->_numResult){
$this->_numResult = mysql_num_rows($this->_getQuery());
}
return $this->_numResult;
}
function valid(){
if($this->_pointer >= 0 && $this->_pointer < $this->_getNumResult()){
return true;
}
return false;
}
protected function _getRow($pointer){
if(isset($this->_results[$pointer])){
return $this->_results[$pointer];
}
$row = mysql_fetch_object($this->_getQuery());
if($row){
$this->_results[$pointer] = $row;
}
return $row;
}
function next(){
$row = $this->_getRow($this->_pointer);
if($row){
$this->_pointer ++;
}
return $row;
}
function current(){
return $this->_getRow($this->_pointer);
}
function close(){
mysql_free_result($this->_getQuery());
Connect::close();
}
}
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.
// ... kode class Tabel sebelumnya.......
function findAll(){
include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Select.php';
$sql = "SELECT * FROM `".$this->_tableName."`";
return new Select($sql);
}
function findBy($field, $value){
include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Select.php';
$sql = "SELECT * FROM `".$this->_tableName."`";
$sql .=" WHERE `".$field."`='".mysql_real_escape_string($value)."'";
return new Select($sql);
}
Jadi kode class Tabel selengkapnya adalah seperti di bawah.
<?php
include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Connect.php';
class Table {
protected $_tableName;
function __construct($tableName){
$this->_tableName = $tableName;
}
public function connect(){
return Connect::getConnection();
}
public function close(){
Connect::close();
}
function save(array $data){
$sql = "INSERT INTO `".$this->_tableName."` SET";
foreach($data as $field => $value){
$sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
}
$sql = rtrim($sql, ',');
$result = mysql_query($sql, Connect::getConnection());
if(!$result){
throw new Exception('Gagal menyimpan data ke table '.$this->_tableName.': '.mysql_error());
}
}
function update(array $data, $where = ''){
$sql = "UPDATE `".$this->_tableName."` SET";
foreach($data as $field => $value){
$sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
}
$sql = rtrim($sql, ',');
if($where){
$sql .= " WHERE ".$where;
}
$result = mysql_query($sql, Connect::getConnection());
if(!$result){
throw new Exception('Gagal mengupdate data table '.$this->_tableName.': '.mysql_error());
}
}
function delete($where = ''){
$sql = "DELETE FROM `".$this->_tableName."`";
if($where){
$sql .= " WHERE ".$where;
}
$result = mysql_query($sql, Connect::getConnection());
if(!$result){
throw new Exception('Gagal menghapus data dari table '.$this->_tableName.': '.mysql_error());
}
}
function findAll(){
include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Select.php';
$sql = "SELECT * FROM `".$this->_tableName."`";
return new Select($sql);
}
function findBy($field, $value){
include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Select.php';
$sql = "SELECT * FROM `".$this->_tableName."`";
$sql .=" WHERE `".$field."`='".mysql_real_escape_string($value)."'";
return new Select($sql);
}
}
Lalu bagaimana cara
menampilkan data dengan konsep OOP, seperti contoh berikut.
<?php
include_once '../Table.php';
$table = new Table('user');
$users = $table->findAll();
?>
<table border="1">
<tr>
<th>User Id</th>
<th>Name</th>
<th>Password</th>
<th>Type</th>
<th>Action</th>
</tr>
<?php foreach($users as $user){?>
<tr>
<td><?php echo $user->user_id;?>
<td><?php echo $user->name;?></td>
<td><?php echo $user->password?></td>
<td><?php echo $user->type?></td>
</tr>
<?php }?>
</table>
Sederhana sekali, hanya buat instant class Tabel dan panggil fungsi findAll() atau fungsi findBy().
Selamat Mencoba dan Berlatih
CRUD OOP.
sumber