Page Nav

HIDE
{fbt_classic_header}

Terbaru :

latest

Akses Aman Database Dengan PHP-PDO

Pada PHP versi 5.4 penggunaan Mysql Extensions sudah jarang digunakan dan informasinya akan dihapus secara keseluruhan pada PHP versi 5....


Pada PHP versi 5.4 penggunaan Mysql Extensions sudah jarang digunakan dan informasinya akan dihapus secara keseluruhan pada PHP versi 5.5. Jadi penggunaan fungsi mysql_connect() atau mysql_query(), mulai dan harus diganti penggunaannya, yaitu bisa menggunakan Mysqli Extensions ataupun PDO (PHP Data Object).

PDO nulai dikenal sejak PHP versi 5.1, yang antarmukanya dapat berinteraksi dengan berbagai jenis database secara seragam. Sehingga Anda dapat akses database MySQL, postgreSQL, SQLlite, 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()); 
?>

Jika dijalankan hasilnya seperti ini : 
Array ( [0] => mysql [1] => pgsql [2] => sqlite ) 

Hal ini karena saya meng-aktifkan database mysql, posgreSQL dan SQLite melalui php.ini
Koneksi Database Dengan PDO

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

Dari kode di atas dapat diturunkan menjadi kode yang lebih baik lagi. Karena data dari pengguna langsung dimasukan ke dalam query SQL tanpa difilter, sehingga rentan disusupi kode dari luar (SQL Injection). Jika menggunakan mysql extension mungkin kita bisa menggunakan fungsi mysql_real_escape_string()

Nah kalau dengan PDO kita dapat menggunakan PDO statement prepare() dan bindParam().

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

6. ?>

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 .... "

Hal ini terjadi karena parameter kedua dari bindParam() harus berupa variabel. sehingga kode di atas dapat diubah menjadi :

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

8. ?>





Tidak ada komentar