Akses Database Menggunakan PDO pada PHP

Sebagian besar programer PHP pasti pernah membuat aplikasi yang harus berinteraksi dengan database. Sampai pada PHP versi 5.1, pilihan yang direkomendasikan adalah menggunakan native drivers seperti Mysql Extensions.

Sayangnya, pada PHP versi 5.4 penggunaan Mysql Extensions mulai ditinggalkan, dan akan dihapus secara keseluruhan pada PHP versi 5.5. Itu artinya, penggunaan fungsi mysql_connect() atau mysql_query(), seperti pada postingan yang lalu, harus diganti. Pilihannya adalah menggunakan Mysqli Extensions atau yang akan dibahas berikut ini, PDO.

PDO (PHP Data Object), yang diperkenalkan sejak PHP versi 5.1, menyediakan antarmuka untuk berinteraksi dengan berbagai jenis database secara seragam. Gampangnya, kita bisa mengakses database MySQL, Firebird, atau IBM dengan syntax yang sama. Namun tidak semua driver otomatis tersedia pada sistem Anda. Untuk memeriksanya kita gunakan:

<?php
print_r(PDO::getAvailableDrivers()); 

Pada artikel ini menggunakan database MySQL, jadi pastikan tulisan berikut ini yang muncul.

Array ( [0] => mysql )

Berikut ini adalah syntax untuk koneksi awal dengan database dan query SELECT MySQL.

<?php
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$pdo->query('SELECT nama FROM tabel_pengguna WHERE id = ' . $_GET['id']);

Kode di atas adalah contoh yang buruk karena data dari pengguna langsung dimasukan ke dalam query SQL tanpa difilter, sehingga rentan disusupi kode dari luar (SQL Injection). Jika dahulu kita biasa menggunakan fungsi mysql_real_escape_string(), sekarang dapat menggunakan PDO statement prepare() dan bindParam().

<?php
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$stmt = $pdo->prepare('SELECT nama FROM tabel_pengguna WHERE id = :id');
$stmt->bindParam(':id', filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT), PDO::PARAM_INT);
$stmt->execute();

Pada baris ke-3, masukan dari pengguna diganti dengan sebuah placeholder. Nama untuk placeholder dimulai dengan tanda titik dua (:). Fungsi filter_input() pada baris ke-4 digunakan untuk memastikan masukan dari luar, dalam hal ini $_GET['id'], benar-benar berupa angka integer. Dengan PDO statement dan bindParam() di atas, kode Anda akan aman dari serangan SQL Injection.

Meskipun kode di atas dapat berjalan dengan baik, namun Anda akan mendapat pesan peringatan (notice):

Only variables should be passed by reference bla.. bla..

Itu terjadi karena parameter kedua dari bindParam() harus berupa variabel. Jadi kode di atas diubah menjadi seperti ini:

<?php
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$stmt = $pdo->prepare('SELECT nama FROM tabel_pengguna WHERE id = :id');

$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();

Untuk contoh berikutnya, akan kita coba query INSERT dan UPDATE.

<?php
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$stmt = $pdo->prepare('INSERT INTO tabel_pengguna (id, nama) VALUES (:id, :nama)');

$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
$nama = filter_input(INPUT_GET, 'nama', FILTER_SANITIZE_STRING)
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':nama', $nama, PDO::PARAM_STR);
$stmt->execute();
<?php
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$stmt = $pdo->prepare('UPDATE tabel_pengguna SET nama = :nama WHERE id = :id');

$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
$nama = filter_input(INPUT_GET, 'nama', FILTER_SANITIZE_STRING)
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':nama', $nama, PDO::PARAM_STR);
$stmt->execute();

Cara mencoba kode-kode di atas, langsung ketik saja di address bar. Contoh: localhost/namafile.php?id=10&nama=ronaldo. Jangan lupa isi variabel-variabel $host, $dbname, $user, dan $pass.

About Sibudi

Ubuntu user | Loves books | Blogger | Web Developer | Learn PHP, JavaScript, Ruby & Python the hard way

14. July 2012 by Sibudi
Categories: PHP | Tags: , , | 1 comment

One Comment

  1. Sangar ni website 😀
    bener-bener membantu min,, thanks

Leave a Reply to Angga Cancel reply

Required fields are marked *