Tutorial PHP - Membuat CRUD Dengan PDO Dan MySQL

Tutorial PHP – Membuat CRUD Dengan PDO dan MySQL

Pada artikel kali ini saya akan menjelaskan tutorial PHP tentang bagaimana cara membuat CRUD dengan PDO dan MySQL. Sebelumnya mungkin ada yang tidak mengetahui apa itu PDO, saya akan jelaskan terlebih dahulu.

Membuat CRUD dengan PDO dan MySQL – Perkenalan

Sebelum kita memulai tutorial PHP tentang cara membuat CRUD dengan PDO dan MySQL ada baiknya kita mengenal terlebih dahulu apa itu PDO dan apa saja kelebihannya dibandingkan dengan modul MySQL dan MySQLi.

Apa itu PDO ?

PDO adalah singkatan dari PHP Data Object yang merupakan sebuah interface untuk bahasa pemrograman PHP untuk berkomunikasi dengan database. Salah satu kelebihan dari PDO adalah fleksibilitas, karena saat development kita tidak perlu mengganti query saat akan migrasi dari suatu DBMS ke DBMS yang lain.

Apa Perbedaan MySQL, MySQLi dan PDO ?

Perbedaan dari MySQL, MySQLi dan PDO pada modul PHP sama seperti yang saya sebutkan sebelumnya yaitu fleksibilitas. MySQL dan MySQLi mempunyai persamaan yang sama yaitu hanya mendukung DBMS MySQL saja, MySQLi dibuat untuk menggantikan modul MySQL yang sudah deprecated.

Sedangkan PDO adalah ekstensi PHP yang mendukung semua DBMS seperti MySQL, PostgreSQL, Oracle, SQL Server dan lain sebagainya.

Contohnya ketika kita pertama kali membangun suatu project web, kita memilih database MySQL. Pada saat ditengah development atau bahkan ketika sudah dalam masa production atau live, kita harus migrasi ke PostgreSQL dengan alasan tertentu.

Jika tanpa PDO, tentu kita harus merombak semua query dan function PHP dari MySQL ke PostgreSQL seperti misalkan mysql_connect atau mysqli_connect yang hanya bisa berkomunikasi dengan database MySQL saja.

Dengan bantuan PDO, kita hanya cukup mengganti driver pada konfigurasi script kita dan aplikasi kita dapat berjalan di lingkungan DBMS yang baru tanpa masalah.

Database & Table

Pada bagian pertama dari Tutorial PHP ini kita akan mulai dengan membuat database terlebih dahulu, untuk studi kasus kali ini saya akan membuat database di MySQL dengan nama contoh_pdo.

Setelah membuat database tersebut, saya membuat sebuah tabel dengan struktur seperti ini

CREATE DATABASE `contoh_pdo`
USE `contoh_pdo`;

DROP TABLE IF EXISTS `contoh_table`;
CREATE TABLE `contoh_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data` varchar(150) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Tabel ini akan kita gunakan untuk CRUD dengan PDO dan MySQL. Sekarang kita masukkan beberapa data kedalam table tersebut.

INSERT INTO `contoh_table` (`id`, `data`) VALUES
(1, 'Contoh Data A'),
(2, 'Contoh Data B'),
(3, 'Contoh Data C'),
(4, 'Contoh Data D'),
(5, 'Contoh Data E');

Class Database CRUD Dengan PDO

Setelah selesai membuat sebuah database dan tabel sekarang kita mulai dengan membuat script untuk koneksi database dengan PDO.

Kita akan menggunakan class database pada PDO agar semakin mudah saat berkomunikasi dengan database.

class Database 
{
    private $host = 'DB_HOST';  
    private $user = 'DB_USER';  
    private $pass = 'DB_PASS';  
    private $dbname = 'DB_NAME';
    private $dbh;  
    private $error;  
}

Kita dapat mengubah nilai pada variabel diatas sesuai dengan konfigurasi database yang kita punya.

Kenapa harus menggunakan Class ? tujuannya agar kita dapat menggunakan function yang ada didalam class tersebut kapanpun dan dimanapun kita mau tanpa harus repot-repot menulis ulang kode yang sama.

Contohnya ketika kita ingin menggunakan class Database, kita tinggal menggunakan kode dibawah ini

$db = new Database();

Pada Class Database ini kita akan bagi menjadi 10 method yaitu

  1. Constructor
  2. Query
  3. Bind
  4. Execute
  5. Result Set
  6. Single
  7. Row Count
  8. Last Insert Id
  9. Transactions
  10. Debug

Setiap method akan menjalankan fungsinya masing-masing dalam setiap query yang diperintahkan.

Constructor

Sekarang kita masukkan sebuah constructor pada class Database

public function __construct(){
    // kode
}  

Apa kegunaan dari constructor ? constructor digunakan untuk menjalankan sebuah fungsi atau perintah tertentu saat suatu method dalam class digunakan. Sebelum method tersebut dipanggil maka constructor akan menjalankan perintah tertentu.

Sekarang kita tambahkan kode didalam constructor sehingga menjadi seperti dibawah ini

public function __construct() {
    // konfigurasi driver  
    $dsn = ‘mysql:host=’ . $this->host . ‘;dbname=’ . $this->dbname;  
	
    $options = array(  
        PDO::ATTR_PERSISTENT => true,  
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION  
    ); 

    // menjalankan koneksi database dengan PDO
    try {  
        $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);  
    } catch(PDOException $e){  
        $this->error = $e->getMessage();  
    }  
}  

Query

Sekarang kita beralih ke method query(). method ini akan mempersiapkan sebuah statement yang berisi sebuah query sebelum akhinya query tersebut dijalankan.

Tujuannya adalah untuk menghindari SQL Injection dengan melakukan filter pada nilai parameter yang dikirimkan user pada query tersebut.

Pertama, kita tambahkan properti $stmt seperti berikut

<?php 

class Database 
{
    private $host = 'DB_HOST';  
    private $user = 'DB_USER';  
    private $pass = 'DB_PASS';  
    private $dbname = 'DB_NAME';
    private $dbh;  
    private $error;  
    private $stmt;
}

?>

Untuk mempersiapkan statement pada query, kita membutuhkan sebuah function dari PDO yaitu prepare.

public function query($query){  
    $this->stmt = $this->dbh->prepare($query);  
}  

Bind

Method selanjutnya yang akan kita buat adalah bind(). Untuk menyiapkan query SQL, kita harus menggunakan bind untuk menggantikan paramater input dari user dengan sebuah placeholder.

public function bind($param, $value, $type = null) {  
    if (is_null($type)) {  
        switch (true) {  
            case is_int($value):  
	        $type = PDO::PARAM_INT;  
		break;  
	    case is_bool($value):  
		$type = PDO::PARAM_BOOL;  
		break;  
	    case is_null($value):  
	        $type = PDO::PARAM_NULL;  
		break;  
	    default:  
	        $type = PDO::PARAM_STR;  
	}  
    }  
    $this->stmt->bindValue($param, $value, $type);  
}  

Execute

Pada bagian ini, kita akan membuat sebuah method bernama execute(). Method ini berfungsi untuk menjalankan atau mengeksekusi query setelah serangkaian proses sebelumnya berhasil di lewati.

public function execute(){  
    return $this->stmt->execute();  
}  

Result Set

Sekarang kita beralih ke method selanjutnya yaitu resultset(). Method ini digunakan untuk mengembalikan hasil dari query yang dijalankan berupa array.

public function resultset(){  
    $this->execute();  
    return $this->stmt->fetchAll(PDO::FETCH_ASSOC);  
}  

Single

Mirip dengan fungsi dari method resultset(). Method single() ini digunakan untuk mengembalikan hasil dari query yang dijalankan, akan tetapi output yang ditampilkan hanya satu baris data saja.

public function single(){  
    $this->execute();  
    return $this->stmt->fetch(PDO::FETCH_ASSOC);  
}  

Row Count

Method rowcount() digunakan untuk menghitung jumlah data yang tampil dari query yang dijalankan. Tidak hanya jumlah data yang berhasil tampil saja, method ini juga akan menampilkan jumlah data yang berhasil di simpan, di ubah maupun dihapus.

public function rowCount(){  
    return $this->stmt->rowCount();  
}  

Last Insert Id

Fungsi dari method lastInsertedId() ini adalah untuk mengembalikan nilai berupa id dari data yang berhasil disimpan. Hal ini sangat berguna jika kamu ingin menjalankan query tertentu dengan memanfaatkan id dari data yang terakhir disimpan.

public function lastInsertId() {  
    return $this->dbh->lastInsertId();  
}  

Transactions

Nah, ini juga adalah kelebihan dari PDO. Transactions memungkinkan kamu untuk melakukan banyak perubahan pada database dalam 1 proses saja.

Jika terdapat kesalahan atau error ditengah-tengah proses pada salah satu query, maka proses akan dianggal gagal dan perubahan akan dibatalkan dan dikembalikan ke kondisi sebelum perubahan dilakukan.

Ada 3 method yang akan kita gunakan untuk transaction yaitu beginTransaction() dengan kode sebagai berikut.

public function beginTransaction(){  
   return $this->dbh->beginTransaction();  
}  

Dan juga endTransaction() sebagai penutup dari transaction tersebut.

public function endTransaction(){  
    return $this->dbh->commit();  
}  

Untuk membatalkan transaction dan kembali ke kondisi semula kita bisa menggunakan cancelTransaction().

public function cancelTransaction(){  
    return $this->dbh->rollBack();  
}

Debug

Yang terakhir adalah debug() dimana method debug() ini digunakan untuk melihat informasi seperti parameter pada query yang akan dijalankan.

public function debug(){  
    return $this->stmt->debugDumpParams();  
}

Pada tahap ini kita sudah dapat membuat CRUD dengan PDO dan MySQL menggunakan class Database yang sudah kita buat sebelumnya.

Saya hanya menjalankan script PHP di console saja tanpa membuat halaman HTML untuk melihat output dari script yang sudah kita buat.

Select Data Dengan PDO

Pada tahap ini kita akan membuat CRUD dengan PDO dan tahap yang akan kita buat pertama-tama adalah proses untuk menampilkan data dari database MySQL menggunakan PDO Class yang sudah kita buat.

Pertama kita akan membuat script untuk menampilkan seluruh data dalam database.

<?php 

require('Database.php');

$db = new Database();
$db->query('SELECT * FROM `contoh_table`');
$result = $db->resultset();

print_r($result);

Output yang akan tampil seharusnya seperti berikut

$ php select.php

// Output
Array
(
    [0] => Array
        (
            [id] => 1
            [data] => Contoh Data A
        )

    [1] => Array
        (
            [id] => 2
            [data] => Contoh Data B
        )

    [2] => Array
        (
            [id] => 3
            [data] => Contoh Data C
        )

    [3] => Array
        (
            [id] => 4
            [data] => Contoh Data D
        )

    [4] => Array
        (
            [id] => 5
            [data] => Contoh Data E
        )

)

Sekarang kita coba dengan script untuk menampilkan 1 data saja.

<?php

require('Database.php');

$db = new Database();
$db->query('SELECT * FROM `contoh_table` WHERE data = :data');
$db->bind(':data', 'Contoh Data B');
$result = $db->single();

print_r($result);

Outputnya adalah sebagai berikut

$ php select_single.php

// output
Array
(
    [id] => 2
    [data] => Contoh Data B
)

Input Data Dengan PDO

Proses selanjutnya dalam membuat CRUD dengan PDO kali ini adalah menyimpan data. Berikut adalah contoh bagaimana cara menyimpan data dengan PDO.

<?php

require('Database.php');

$db = new Database();
$db->query('INSERT INTO `contoh_table` (`data`) VALUES (:data)');  
$db->bind(':data', 'Contoh Data F');
$db->execute();

echo $db->lastInsertId();

// Output
// 6

Angka 6 yang tampil pada output adalah id dari data yang berhasil kita simpan. Lalu bagiamana jika kita menyimpan banyak data sekaligus ? disinilah kita bisa menggunakan Transactions saat menjalankan query.

<?php

require('Database.php');

$db = new Database();

// query yang akan dijalankan ditempatkan 
// diantara beginTransaction() dan endTransaction()
$db->beginTransaction();
  $db->query('INSERT INTO `contoh_table` (`data`) VALUES (:data)');  
  $db->bind(':data', 'Contoh Data G');
  $db->execute();
  $db->bind(':data', 'Contoh Data H');
  $db->execute();
  $db->bind(':data', 'Contoh Data I');
  $db->execute();
  $db->bind(':data', 'Contoh Data J');
  $db->execute();
  echo $db->lastInsertId();
$db->endTransaction();

// Output
// 10

Jika terdapat error pada proses query diatas, maka data yang sudah disimpan kedalam database akan dihapus kembali ke kondisi semula sebelum proses query dijalankan.

Update Data Dengan PDO

Proses selanjutnya dalam membuat CRUD dengan PDO kali ini adalah proses update data. Pada proses update data scriptnya sama dengan script untuk menyimpan data sebelumnya dan hanya dibedakan dari query saja.

<?php

require('Database.php');

$db = new Database();
$db->query('UPDATE `contoh_table` SET `data`=:data WHERE `id`=:id');  
$db->bind(':data', 'Contoh Data K');
$db->bind(':id', 10);
$db->execute();

Delete Data Dengan PDO

Begitu juga dengan script untuk menghapus data dengan PDO.

<?php

require('Database.php');

$db = new Database();
$db->query('DELETE FROM `contoh_table` WHERE `id`=:id');  
$db->bind(':id', 10);
$db->execute();

Sekian dulu tutorial PHP dari saya, kita sudah mengenal apa itu PDO dan juga belajar cara membuat CRUD dengan PDO dan MySQL. Kamu dapat mendownload source code dari tutorial ini di halaman Github saya.

Silahkan dicoba dan semoga bermanfaat.

Tinggalkan komentar