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. Pada Tutorial PHP OOP: Save Edit Delete & Menampilkan Data dengan OOP ini akan dibahas cara menyimpan, menampilkan, mengedit, dan menghapus data menggunakan konsep 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.
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.
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).
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.
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. _userid disimpan di kolom _userid, 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
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', namakolom2='nilai 2'.
Buat kode sql untuk bagian warna merah
// ... kode sebelumnya ........
function save(array $data){
$sql = "UPDATE `".$this->_tableName."` SET"; // sql bagian cetak tebal
buat kode sql bagian bagian cetak miring dan sambungkan dengan dengan bagian cetak tebal
// ... kode sebelumnya ........
foreach($data as $field => $value){ //sql cetak miring
$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();
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 namatabel 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 cetak miring
// ....... kode sebelumnya.......
function update(array $data, $where = ''){
$sql = "UPDATE `".$this->_tableName."` SET"; // sql bagian cetak miring
buat sql bagian cetak tebal dan sambung dengan sql bagian cetak miring
// ......... kode sebelumnya .........
foreach($data as $field => $value){ // sql bagian cetak tebal
$sql .= " `".$field."`='".mysql_real_escape_string($value, Connect::getConnection())."',";
}
$sql = rtrim($sql, ','); // hilangkan kelebihan tanda koma ,
buat sql bagian where
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();
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 cetak tebal 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 dari sebuah tabel database bisa menggunakan fungsi mysql_fetch_array, mysql_fetch_assoc, atau mysql_fetch_object. Sesuai dengan bahasan tutorial ini, maka fungsi yang sesuai adalah mysql_fetch_object karena fungsi mysql_fetch_object me-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