Halo! Sekarang sudah edisi ke 13, yeay! Dan di edisi Belajar PHP OOP kali ini, saya akan membahas tentang membuat aplikasi CRUD sederhana dengan PDO. Dan sudah pasti kita bakalan mengimplementasikan apa yang sudah dipelajari di edisi Belajar PHP OOP sebelumnya. Kalau sudah dengar CRUD (Create, Read, Update, Delete), pasti kamu bisa membayangkan aplikasi yang bisa memanipulasi data, seperti menambahkan, menampilkan, mengubah dan menghapus data. Kalau di postingan saya sebelumnya, kita sudah membahas tentang CRUD dengan framework CodeIgniter [Baca: CRUD Sederhana CodeIgniter]. Nah, untuk kali ini kita akan membahas CRUD PDO. Untuk yang belum kenal apa itu PDO, kita kenalan dulu, ya!
Jadi, PDO itu singkatan dari PHP Data Object. Nah, PDO ini tuh extension di PHP yang digunakan untuk mengakses database. Dalam PDO juga terdapat data-access abstraction layer pada PDO, sehingga memungkinkan kita menggunakan fungsi yang sama untuk berbagai jenis database. Mau pakai MySQL, MSSQL, Postgresql, ataupun Oracle, kamu bisa pakai fungsi yang sama untuk memanipulasi data.
Lalu, kenapa CRUD Dengan PDO jadi tema di edisi kali ini? Itu karena, beberapa waktu yang lalu, di diskusi grup ada yang menanyakan hal yang terkait Deprecated-nya MySQL sewaktu upgrade versi PHP, katanya terdapat error pada aplikasinya karena masih menggunakan MySQL. Setelah saya googling, banyak yang menyarankan untuk menggunakan PDO. (Sebetulnya dierrornya juga sudah ada petunjuknya sih, kalau kita perhatikan). Hmm, ini cukup menggelitik rasa penasaran saya untuk mencoba membuat aplikasi CRUD sederhana dengan PDO dan untuk tampilannya (user interface), saya akan coba memakai Bootsrap. Daan, sebagai contoh saya akan membuat aplikasi CRUD sederhana untuk mengelola data barang pada aplikasi kasir. Seperti apa langkah-langkah dalam membuat aplikasi CRUD dengan PDO? Try this out ya!
[1] Persiapan
Ya, pertama kita harus menyiapkan lab kita. Kita buat folder baru di dalam folder htdocs (asumsi, kamu pakai Xampp) kita kasih nama aplikasi_kasir. (kamu boleh kasih nama apa aja, bebas kok..) ^^
Nanti folder tersebut bakalan kita pakai untuk menyimpan file-file php. FYI, Karena User Interfacenya saya menggunakan Bootsrap yang diload melalui CDN, mungkin kamu perlu juga siapin koneksi internet. Atau kamu bisa download Bootstrapnya terlebih dahulu di tautan ini.
Selanjutnya kita akan buat database. Karena aplikasi yang akan kita buat itu berhubungan dengan manipulasi data atau CRUD, tentu saja kita harus buat database terlebih dahulu. Sekarang saya buat database menggunakan
phpMyAdmin. Databasenya saya beri nama belajar_oop. Setelah itu kita buat table di dalam database yang baru saja kita buat, saya kasih nama barang dengan struktur tabel seperti gambar berikut:Oh iya, kita juga bisa buat table pakai perintah SQL di bawah ini lho!
CREATE TABLE `barang` (
`id_barang` varchar(10) NOT NULL,
`nama` varchar(50) NOT NULL,
`stok` int(10) NOT NULL,
`harga` int(25) NOT NULL,
PRIMARY KEY (`id_barang`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Kalau tabelnya sudah kamu buat, kamu boleh isi tabelnya sesuka hati. Sebagai contoh saya isi kaya gambar ini:
Abaikan harga barang yang sama, namanya juga contoh. Hihi
[2] Konfigurasi Database
Setelah database dan tabelnya sudah kita buat, selanjutnya kita buat file untuk mengkonfigurasi database. Buka text editor kesayanganmu, lalu ketik sintaks di bawah ini:
<?php
try
{
$con = new PDO('mysql:host=localhost;dbname=belajar_oop', 'root', '', array(PDO::ATTR_PERSISTENT => true));
}
catch(PDOException $e)
{
echo $e->getMessage();
}
include_once 'barang_class.php';
$brg = new barang($con);
?>
Simpan filenya di folder aplikasi_kasir dengan nama dbconfig.php.
Bisa kita lihat, pada baris ke 5, kita akan membuat object $con menggunakan Class PDO, bersamaan dengan informasi data source name dan user credential pada parameternya, yaitu localhost untuk hostnya, belajar_oop untuk databasenya, root untuk username dan password (isi password kalau mysql kamu pakai password).
Selain konfigurasi database, kita juga akan memanggil file barang_class.php menggunakan fungsi
include_once pada baris ke 12. Lalu kita buat sebuah object dengan $brg. Nanti kita bakalan pakai object ini di file lainnya.[3] Coding Time
Ya, it's coding time! Langkah selanjutnya kita akan membuat beberapa file php, yaitu barang_class.php, index.php, add.php, edit.php, dan hapus.php. File-file php tersebut dan file dbconfig.php kita simpan dalam folder aplikasi_kasir. Sekarang kita buat file barang_class.php. Buka kembali text kesayanganmu, lalu ketik sintaks di bawah ini:
<?php
class barang
{
private $db;
public function __construct($con){
$this->db = $con;
}
### Start : fungsi insert data ke database ###
public function insertData($id_barang,$nama,$stok,$harga){
try{
$stmt = $this->db->prepare("INSERT INTO barang(id_barang,nama,stok,harga) VALUES(:id_barang, :nama, :stok, :harga)");
$stmt->bindparam(":id_barang",$id_barang);
$stmt->bindparam(":nama",$nama);
$stmt->bindparam(":stok",$stok);
$stmt->bindparam(":harga",$harga);
$stmt->execute();
return true;
}catch(PDOException $e){
echo $e->getMessage();
return false;
}
}
### End : fungsi insert data ke database ###
### Start : fungsi ambil data dari database ###
public function getID($id_barang){
$stmt = $this->db->prepare("SELECT * FROM barang WHERE id_barang=:id_barang");
$stmt->execute(array(":id_barang"=>$id_barang));
$data=$stmt->fetch(PDO::FETCH_ASSOC);
return $data;
}
### End: fungsi ambil data dari database ###
### Start : fungsi untuk menampilkan data dari database ###
public function viewData($query){
$stmt = $this->db->prepare($query);
$stmt->execute();
if($stmt->rowCount()>0){
while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
?>
<tr>
<td><?php echo($row['id_barang']); ?></td>
<td><?php echo($row['nama']); ?></td>
<td><?php echo($row['stok']); ?></td>
<td><?php echo($row['harga']); ?></td>
<td align="center">
<a href="edit.php?edit_id=<?php echo($row['id_barang']); ?>">
<i class="glyphicon glyphicon-edit"></i></a>
</td>
<td align="center">
<a href="hapus.php?delete_id=<?php echo($row['id_barang']); ?>">
<i class="glyphicon glyphicon-remove-circle"></i></a>
</td>
</tr>
<?php
}
}else{
?>
<tr>
<td>Data tidak ditemukan...</td>
</tr>
<?php
}
}
### End : fungsi untuk menampilkan data dari database ###
### Start : fungsi untuk memperbaharui data###
public function updateData($id_barang,$nama,$stok,$harga){
try{
$stmt=$this->db->prepare("UPDATE barang SET nama=:nama,
stok=:stok,
harga=:harga
WHERE id_barang=:id_barang ");
$stmt->bindparam(":id_barang",$id_barang);
$stmt->bindparam(":nama",$nama);
$stmt->bindparam(":stok",$stok);
$stmt->bindparam(":harga",$harga);
$stmt->execute();
return true;
}catch(PDOException $e){
echo $e->getMessage();
return false;
}
}
### End : fungsi untuk memperbaharui data###
### Start : fungsi untuk menghapus data###
public function deleteData($id_barang){
$stmt = $this->db->prepare("DELETE FROM barang WHERE id_barang=:id_barang");
$stmt->bindparam(":id_barang",$id_barang);
$stmt->execute();
return true;
}
### End : fungsi untuk menghapus data###
### Start : fungsi paging###
public function paging($query,$records_per_page){
$starting_position=0;
if(isset($_GET["page_no"])){
$starting_position=($_GET["page_no"]-1)*$records_per_page;
}
$query2=$query." limit $starting_position,$records_per_page";
return $query2;
}
### End : fungsi paging###
### Start : fungsi pindah page###
public function paginglink($query,$records_per_page){
$self = $_SERVER['PHP_SELF'];
$stmt = $this->db->prepare($query);
$stmt->execute();
$total_no_of_records = $stmt->rowCount();
if($total_no_of_records > 0){
?><ul class="pagination"><?php
$total_no_of_pages=ceil($total_no_of_records/$records_per_page);
$current_page=1;
if(isset($_GET["page_no"])){
$current_page=$_GET["page_no"];
}
if($current_page!=1){
$previous =$current_page-1;
echo "<li><a href='".$self."?page_no=1'>First</a></li>";
echo "<li><a href='".$self."?page_no=".$previous."'>Previous</a></li>";
}
for($i=1;$i<=$total_no_of_pages;$i++){
if($i==$current_page){
echo "<li><a href='".$self."?page_no=".$i."' style='color:red;'>".$i."</a></li>";
}else{
echo "<li><a href='".$self."?page_no=".$i."'>".$i."</a></li>";
}
}
if($current_page!=$total_no_of_pages){
$next=$current_page+1;
echo "<li><a href='".$self."?page_no=".$next."'>Next</a></li>";
echo "<li><a href='".$self."?page_no=".$total_no_of_pages."'>Last</a></li>";
}
?></ul><?php
}
}
### End : fungsi pindah page###
}
Simpan kembali file barang_class.php.
Selanjutnya, kita buat file index.php yang digunakan untuk menampilkan data barang dalam tabel. Buka kembali teks editor lalu ketik sintaks di bawah ini:
<?php
include_once 'dbconfig.php';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Aplikasi CRUD Sederhana Dengan PHP OOP PDO</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--Bootstrap-->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="panel panel-primary">
<div class="panel-heading">Data Barang</div>
<div class="panel-body">
<a href="add.php" class="btn btn-large btn-default">
<i class="glyphicon glyphicon-plus"></i>
Tambah Data</a>
<br/><br/>
<table class='table table-bordered table-responsive'>
<tr>
<th>ID Barang</th>
<th>Nama Barang</th>
<th>Stok</th>
<th>Harga</th>
<th colspan="2" align="center">Actions</th>
</tr>
<?php
$query = "SELECT * FROM barang";
$records_per_page=5;
$newquery = $brg->paging($query,$records_per_page);
$brg->viewData($newquery);
?>
<tr>
<td colspan="7" align="center">
<div class="pagination-wrap">
<?php $brg->paginglink($query,$records_per_page); ?>
</div>
</td>
</tr>
</table>
</div><!--End: Panel-body-->
</div><!--End: Panel-->
</div>
<div class="container">
<div class="alert alert-success">
<p><strong>Selamat Belajar :) </strong></p>
<p>If you have question, feel free to ask me <a href="http://facebook.com/gungunpriatna002">here</a>!</p>
</div>
</div>
<!--Bootstrap-->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</html>
Simpan kembali file index.php.
Nah, untuk menambahkan data kita akan buat file add.php. Ketik lagi sintaks di bawah ini ya! ^^
<?php
include_once 'dbconfig.php';
if(isset($_POST['btn-save']))
{
$id_barang = strtoupper($_POST['id_barang']);
$nama = $_POST['nama'];
$stok = $_POST['stok'];
$harga = $_POST['harga'];
if($brg->insertData($id_barang,$nama,$stok,$harga)){
header("Location: add.php?inserted");
}else{
header("Location: add.php?failure");
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Aplikasi CRUD Sederhana Dengan PHP OOP PDO</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--Bootstrap-->
<!--Bootstrap-->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="panel panel-primary">
<div class="panel-heading">Form Tambah Data</div>
<div class="panel-body">
<?php
if(isset($_GET['inserted']))
{
?>
<div class="container">
<div class="alert alert-info">
<strong>Info!</strong> Data berhasil tersimpan! Silakan klik di <a href="index.php">sini</a> untuk kembali ke beranda.
</div>
</div>
<?php
}
else if(isset($_GET['failure']))
{
?>
<div class="container">
<div class="alert alert-warning">
<strong>Warning!</strong> Data gagal disimpan !
</div>
</div>
<?php
}
?>
<div class="clearfix"></div><br />
<form method='post'>
<table class='table table-bordered'>
<tr>
<td>Id Barang</td>
<td><input type='text' name='id_barang' class='form-control' required maxlength="10" autofocus></td>
</tr>
<tr>
<td>Nama Barang</td>
<td><input type='text' name='nama' class='form-control' required maxlength="50"></td>
</tr>
<tr>
<td>Stok</td>
<td><input type='text' name='stok' class='form-control' required></td>
</tr>
<tr>
<td>Harga</td>
<td><input type='text' name='harga' class='form-control' required></td>
</tr>
<tr>
<td colspan="2">
<button type="submit" class="btn btn-primary" name="btn-save">Simpan
</button>
<button type="reset" class="btn btn-primary" name="btn-reset">Reset
</button> <br/><br/>
<a href="index.php" class="btn btn-large btn-success">
<i class="glyphicon glyphicon-backward"></i> Kembali ke halaman utama</a>
</td>
</tr>
</table>
</form>
</div><!--End: Panel-body-->
</div><!--End: Panel-->
</div>
<div class="container">
<div class="alert alert-success">
<p><strong>Selamat Belajar :) </strong></p>
<p>If you have question, feel free to ask me <a href="http://facebook.com/gungunpriatna002">here</a>!</p>
</div>
</div>
<!--Bootstrap-->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</html>
Setelah selesai diketik, simpan kembali file add.php.
Berikutnya, kita buat file edit.php. Ya, buka kembali text editor kesayanganmu, lalu ketik sintaks di bawah ini:
<?php
include_once 'dbconfig.php';
$id_barang = $_GET['edit_id'];
if(isset($_POST['btn-update'])){
$nama = $_POST['nama'];
$stok = $_POST['stok'];
$harga = $_POST['harga'];
if($brg->updateData($id_barang,$nama,$stok,$harga)){
$msg = "<div class='alert alert-info'>
<strong>Info</strong> Data berhasil diubah! Silakan klik di <a href='index.php'>sini</a> untuk kembali ke beranda.
</div>";
}else{
$msg = "<div class='alert alert-warning'>
<strong>Warning!</strong> Update Data Gagal !
</div>";
}
}
if(isset($id_barang)){
extract($brg->getID($id_barang));
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Aplikasi CRUD Sederhana Dengan PHP OOP PDO</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--Bootstrap-->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="panel panel-primary">
<div class="panel-heading">Form Edit Data</div>
<div class="panel-body">
<?php
if(isset($msg))
{
echo $msg;
}
?>
</div>
<div class="clearfix"></div><br />
<form method='post'>
<table class='table table-bordered'>
<tr>
<td>Id Barang</td>
<td><input type='text' name='id_barang' class='form-control' required maxlength="10" value="<?php echo $id_barang; ?>" readonly></td>
</tr>
<tr>
<td>Nama Barang</td>
<td><input type='text' name='nama' class='form-control' required maxlength="50" value="<?php echo $nama; ?>" autofocus></td>
</tr>
<tr>
<td>Stok</td>
<td><input type='text' name='stok' class='form-control' value="<?php echo $stok; ?>" required></td>
</tr>
<tr>
<td>Harga</td>
<td><input type='text' name='harga' class='form-control' value="<?php echo $harga; ?>" required></td>
</tr>
<tr>
<td colspan="2">
<button type="submit" class="btn btn-primary" name="btn-update">Simpan
</button>
<button type="reset" class="btn btn-primary" name="btn-reset">Reset
</button> <br/><br/>
<a href="index.php" class="btn btn-large btn-success">
<i class="glyphicon glyphicon-backward"></i> Kembali ke halaman utama</a>
</td>
</tr>
</table>
</form>
</div><!--End: Panel-body-->
</div><!--End: Panel-->
</div>
<div class="container">
<div class="alert alert-success">
<p><strong>Selamat Belajar :) </strong></p>
<p>If you have question, feel free to ask me <a href="http://facebook.com/gungunpriatna002">here</a>!</p>
</div>
</div>
<!--Bootstrap-->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</html>
Yep, simpan file edit.php.
Dan yang terakhir, kita buat file hapus.php. Ok, ketik kembali sintaks di bawah ini:
<?php
include_once 'dbconfig.php';
if(isset($_POST['btn-del'])){
$id_barang = $_GET['delete_id'];
$brg->deleteData($id_barang);
header("Location: hapus.php?deleted");
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Contoh Implementasi Class Diagram</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--Bootstrap-->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="panel panel-primary">
<div class="panel-heading">Halaman Hapus Data</div>
<div class="panel-body">
<?php
if(isset($_GET['deleted']))
{
?>
<div class="alert alert-success">
<strong>Info!</strong> Data berhasil dihapus...
</div>
<?php
}
else
{
?>
<div class="alert alert-danger">
<strong>Warning!</strong> apa anda yakin ingin menghapusnya ?
</div>
<?php
}
?>
</div>
<div class="container">
<?php
if(isset($_GET['delete_id'])){
$id_barang = $_GET['delete_id'];
?>
<table class='table table-bordered'>
<tr>
<th>#</th>
<th>Nama</th>
<th>Stok</th>
<th>Harga</th>
</tr>
<?php
extract($brg->getID($id_barang));
?>
<tr>
<td><?php echo $id_barang; ?></td>
<td><?php echo $nama; ?></td>
<td><?php echo $stok; ?></td>
<td><?php echo $harga; ?></td>
</tr>
</table>
<?php
}
?>
</div>
<div class="container">
<p>
<?php
if(isset($id_barang))
{
?>
<form method="post">
<input type="hidden" name="id" value="<?php echo $id_barang; ?>" />
<button class="btn btn-large btn-primary" type="submit" name="btn-del">
<i class="glyphicon glyphicon-trash"></i> YES</button>
<a href="index.php" class="btn btn-large btn-success">
<i class="glyphicon glyphicon-backward"></i> NO</a>
</form>
<?php
}
else
{
?>
<a href="index.php" class="btn btn-large btn-success">
<i class="glyphicon glyphicon-backward"></i> Back to index</a>
<?php
}
?>
</p>
</div>
</div><!--End: Panel-body-->
</div><!--End: Panel-->
</div>
<div class="container">
<div class="alert alert-success">
<p><strong>Selamat Belajar :) </strong></p>
<p>If you have question, feel free to ask me <a href="http://facebook.com/gungunpriatna002">here</a>!</p>
</div>
</div>
<!--Bootstrap-->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</html>
Simpan file hapus.php dan selesai. :D
Nah, sekarang kita punya 6 file php yang di simpan di folder aplikasi_kasir. Bisa kita lihat di gambar di bawah ini.
[4] Uji Coba Program
Nah, sekarang kita coba run di browser, nanti bakalan muncul tampilan seperti di gambar ini:
Yep, di gambar di atas sudah ada datanya, soalnya tadi sudah saya isi sewaktu buat table. Hihi. Nah, untuk menambah data barang, coba klik tombol 'Tambah Data', nanti bakalan dialihkan ke halaman add.php. Di halaman ini ada form untuk menambah data barang. Sekarang kita coba isi formnya, misalnya kaya gini.. ^^
Setelah kamu isi formnya, klik tombol 'Simpan' untuk menyimpan data barang. Nah, untuk mengecek datanya udah disimpan atau belum kamu bisa klik tombol 'Kembali ke halaman utama'. Nah, kamu bisa lihat datanya udah tersimpan.
Di gambar di atas, saya udah coba menambah beberapa barang. Kalau data melebihi 5, nanti bakalan nambah halamannya kaya gambar di atas. Untuk mengatur jumlah data yang ditampilkan di dalam tabel, cek halaman index.php line 35.
Di line 35 ada variabel
$records_per_page, valuenya disetting 5 untuk menampilkan 5 data perhalamannya. Untuk mengatur data yang ditampilkan perhalamannya, kamu bisa mengganti value variabel tersebut. Selanjutnya, coba kamu perhatikan di tabel ada kolom 'Actions' yang berisi dua icon, icon edit sama icon delete. Nah, untuk mengedit data barang, coba kamu klik icon edit.
Kamu bisa lihat form edit dan juga data barangnya. Coba kamu edit datanya, lalu klik 'Simpan'. Bakalan muncul pemberitahuan kalau data berhasil diubah. Sekarang klik tombol ke 'Kembali ke halaman utama', kita bisa lihat di tabel kalau datanya sudah berhasil kita ubah. ^^
Lalu, bagaimana kalau kita mau hapus data barang? Yep, kamu benar.^^ Kita tinggal klik icon 'delete' di kolom actions. Nanti bakalan muncul pertanyaan untuk konfirmasi hapus data. Kamu tinggal Klik 'Yes' untuk menghapus data.
See? Datanya sudah terhapus.. ^^
****
Kawan, aplikasi CRUD ini masih sederhana. Masih banyak kekurangan yang bisa diperbaiki. Masih terdapat banyak ruang yang bisa kamu kembangkan. Semoga dengan adanya seri Belajar PHP OOP edisi ke 13 ini bisa menambah semangat belajarmu, yes!
Semoga bermanfaat.. ^^
***
Referensi:
Situs utama PHP @ http://www.php.net;
Manual PHP @ http://php.net/manual/en/index.php;
PDO @ http://php.net/manual/en/book.pdo.php











