Koneksi PDO pada PHP

Tidak seperti fungsi-fungsi mysql_ dan mysqli_, PDO tidak perlu melakukan memanggil fungsi connect(). Cukup membuat sebuah objek PDO, maka objek tersebut siap digunakan, tidak perlu melakukan connect() dan close() database. Sintaks untuk membuat objek PDO sebagai berikut:

$db = new PDO($dsn, $user, $pass, $opts);

Dengan

  • $dsn, Data Source Name, menjelaskan jenis database server, lokasi database server, dan sebagainya.
  • $user dan $pass, username dan password MySQL,
  • $opts, adalah opsi-opsi penggunaan PDO.

Pada constructor PDO di atas, semua parameter selain $dsn bersifat opsional. Akan tetapi untuk koneksi ke MySQL, $user dan $pass juga dibutuhkan. Silahkan coba buat file sambung.php yang isinya:

<?php
$host = "127.0.0.1";
$dbname = "toko";
$dbuser = "root";
$dbpass = "rahasia";
$opts = [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION];
$dsn = "mysql:host=$host;charset=utf8;dbname=$dbname;";
$db = new PDO($dsn, $dbuser, $dbpass, $opts);
?>

$host

Pada contoh di atas, $host diisi "127.0.0.1", dapat diisi juga dengan "localhost". Berdasarkan hasil uji coba penulis, pada sistem operasi windows, koneksi ke 127.0.0.1 lebih cepat daripada ke localhost. Dan sebaliknya pada Linux, koneksi ke localhost lebih cepat daripada ke 127.0.0.1. Jadi silahkan pilih sesuai dengan sistem operasi Anda.

$dbname

$dbname adalah nama database awal yang dituju. Agar kode program di atas berjalan dengan lancar, database toko harus sudah ada. Untuk uji coba, melalui phpMyAdmin atau command prompt, buat database dan tabel di MySQL dengan perintah:

CREATE DATABASE IF NOT EXISTS toko;
CREATE TABLE IF NOT EXISTS toko.barang (
id INT PRIMARY KEY AUTO_INCREMENT,
  tipe VARCHAR(50),
  kategori VARCHAR(50),
  harga INT
) engine=innodb;

Atau bila menggunakan PostgreSQL:

CREATE DATABASE IF NOT EXISTS toko;
CREATE TABLE IF NOT EXISTS toko.barang (
  id SERIAL PRIMARY KEY,
  tipe VARCHAR(50),
  kategori VARCHAR(50),
  harga INT
) engine=innodb;

$dsn

Variabel ini dapat mengatur berbagai macam hal, seperti jenis database server, alamat server yang dituju, database awal yang digunakan, dan parameter lainnya. Variabel $host dan $dbname di atas sebetulnya hanya merupakan bagian dari $dsn ini. Dibuat variabel terpisah agar kode program ini mudah dibaca dan dijelaskan. Pada contoh di atas, kita juga menyatakan parameter charset, yaitu pengkodean karakter di dalam database server. Kita menggunakan charset utf8 yang dapat menampung semua jenis karakter, termasuk huruf arab, jepang, mandarin, korea dan sebagainya.

$opts

Variabel $opts bersifat opsional. Melalui variable ini, kita dapat mengatur beberapa perilaku PDO. Pada contoh di atas, PDO::ATTR_ERRMODE diberi nilai PDO::ERRMODE_EXCEPTION, sehingga bila terdapat error, PDO akan melempar Exception yang dapat kita tangkap dengan struktur try-catch. Jika tidak menggunakan $opts pada constructor PDO, opsi-opsi ini juga dapat diatur melalui method $db->setAttribute().

Jika Anda hanya menggunakan MySQL, silahkan lanjut ke tutorial berikutnya. Di bawah ini adalah hal-hal yang tidak terlalu penting untuk diketahui.

Penanganan error pada PDO

Opsi pada perintah koneksi PDO di atas $db = new PDO($dsn, $user, $pass, $opts);, dapat dihilangkan sehingga menjadi $db = new PDO($dsn, $user, $pass);. Dan opsi PDOnya dapat diatur setelah koneksi dengan menggunakan method setAttribute(). Terdapat banyak atribut yang dapat diatur, dapat dilihat pada manual PHP. Sedikit diantaranya:

  • PDO::ATTR_ERRMODE, mengatur mode error. Terdapat beberapa pilihan nilai:
    • PDO::ERRMODE_SILENT, merupakan mode default. Ketika error, hanya mengisi variabel $db->errorInfo() dan $db->errorCode()
    • PDO::ERRMODE_WARNING, sama seperti mode silent, tetapi juga menghasilkan E_WARNING. Yaitu error PHP yang bersifat peringatan.
    • PDO::ERRMODE_EXCEPTION, melemparkan PDOException ketika terjadi error.
  • PDO::ATTR_DEFAULT_FETCH_MODE, mengatur mode pengambilan data. Mode yang tersedia akan dibahas pada topik pengambilan data.
  • PDO::ATTR_CASE, mengatur besar-kecil huruf pada nama kolom database.

Contoh penggunaan perintah setAttribute():

$db = new PDO($dsn, $dbuser, $dbpass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

Bila tidak diatur, PDO::ATTR_ERRMODE akan bernilai PDO::ERRMODE_SILENT, dimana ketika terjadi error, PDO tidak melakukan apapun kecuali mengisi variabel PDO::errorInfo() dan PDO::errorCode(), pada mode ini, penanganan error dapat dilakukan dengan cara:

$perintah = $db->query($sql) or die("ERROR: ".implode(":",$db->errorInfo()));

Sedangkan bila mengunakan PDO::ERRMODE_EXCEPTION, maka penanganan error dilakukan dengan try-catch. Mode ini merupakan mode yang dianjurkan. Contohnya:

<?php
include "sambung.php";
try {
    $perintah = $db->query($sql);
} catch (Exception $ex) {
    die("ERROR: ".implode(":",$db->errorInfo()));
}
?>

Koneksi PDO ke database server lain

Selain MySQL, PDO dapat digunakan untuk koneksi ke database lain seperti MSSQL dan Postgresql. Untuk mengetahui driver PDO yang terinstall pada PHP Anda, dapat menggunakan perintah PDO::getAvailableDrivers():

echo "<pre>".print_r(PDO::getAvailableDrivers(), true)."</pre>";

Output:

Array
(
    [0] => mysql
    [1] => odbc
    [2] => pgsql
)

Jika menggunakan database server lain, cara penggunaan pdo masih sama, hanya terdapat perbedaan pada saat membuat objek PDO. Berikut beberapa contoh penggunaan dengan database server lain:

try {
  # MS SQL Server dan Sybase dengan PDO_DBLIB
  $db = new PDO("mssql:host=$host;dbname=$dbname, $dbuser, $dbpass");
  $db = new PDO("sybase:host=$host;dbname=$dbname, $dbuser, $dbpass");
  # MySQL
  $db = new PDO("mysql:host=$host;dbname=$dbname", $dbuser, $dbpass);
  # ODBC
  $db = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\db.mdb;Uid=Admin");
  # SQLite Database
  $db = new PDO("sqlite:my/database/path/database.db");
  # PostgreSQL database
  $db = new PDO("pgsql:host=$host;port=5432;dbname=$dbname;",$dbuser,$dbpass);
}
catch(PDOException $e) {
  echo $e->getMessage();
}