PDO adalah titik masuk seluruh akses basis data pada jalur ini, dan koneksi yang benar menjadi fondasinya. Topik ini membahas bentuk DSN (Data Source Name) untuk SQLite beserta perbandingannya dengan MySQL dan PostgreSQL, opsi koneksi yang diteruskan ke constructor, serta mode error yang menentukan cara PDO melaporkan kegagalan. Pembahasan juga mencakup penutupan koneksi yang benar. Setelah topik ini dipelajari, koneksi basis data dapat dibuka dan ditutup dengan perilaku error yang terkendali dan mudah didiagnosis.
Mengenal PDO dan peran DSN#
PDO adalah PHP Data Objects, yaitu lapisan antarmuka bawaan PHP untuk mengakses basis data. Tanpa lapisan ini, kode untuk MySQL ditulis dengan ekstensi yang berbeda dari kode untuk PostgreSQL, sehingga berganti server berarti menulis ulang hampir seluruh bagian akses data. PDO menyatukan perbedaan tersebut di belakang antarmuka yang sama, yaitu kelas PDO untuk koneksi, kelas PDOStatement untuk pernyataan SQL, dan kelas PDOException untuk laporan kegagalan. Bagian yang memang berbeda antar basis data didelegasikan kepada driver, yaitu modul ekstensi yang menerjemahkan panggilan PDO ke protokol basis data tertentu, misalnya pdo_sqlite atau pdo_mysql.
Setiap koneksi dimulai dari DSN, yaitu string yang menjelaskan ke mana dan bagaimana koneksi dibuat. DSN terdiri atas nama skema driver diikuti titik dua, sedangkan detail setelah titik dua ditafsirkan oleh driver masing-masing. Untuk SQLite, detail itu berupa lokasi berkas basis data, dan nilai khusus :memory: membuat basis data hidup di memori sehingga cepat dan bebas sisa berkas. Tabel berikut merangkum bentuk DSN yang paling sering dipakai.
| Basis data | Bentuk DSN | Keterangan |
|---|---|---|
| SQLite di memori | sqlite::memory: | Basis data hanya hidup selama koneksi ada |
| SQLite berkas | sqlite:perpustakaan.sqlite | Data tersimpan dalam berkas di samping skrip |
| MySQL | mysql:host=localhost;dbname=perpustakaan | Detail host dan nama basis data dipisah titik koma |
| PostgreSQL | pgsql:host=localhost;port=5432;dbname=perpustakaan | Port dinyatakan eksplisit bila bukan 5432 |
Pada MySQL dan PostgreSQL, DSN memuat host, port, dan nama basis data, sedangkan nama pengguna serta sandi dikirim sebagai argumen kedua dan ketiga constructor. Fragmen berikut memperlihatkan penulisannya. Sandbox tidak menyediakan server MySQL maupun PostgreSQL, sehingga fragmen ini tidak dijalankan dan hanya menunjukkan bentuknya.
// tidak-dijalankan
$pdoMysql = new PDO('mysql:host=localhost;dbname=perpustakaan;charset=utf8mb4', 'pengguna', 'sandi');
$pdoPgsql = new PDO('pgsql:host=localhost;port=5432;dbname=perpustakaan', 'pengguna', 'sandi');Dalam satu alur koneksi, skrip memanggil PDO, PDO menyediakan antarmuka seragam, dan driver berbicara dengan basis data sasarannya.
Membuka dan menutup koneksi#
Koneksi dibuka dengan operator new pada kelas PDO. Parameter pertama adalah DSN, parameter kedua dan ketiga berisi nama pengguna serta sandi, dan parameter keempat berupa array opsi yang diterapkan segera setelah koneksi terbentuk. SQLite tidak mengenal kredensial, sehingga kedua parameter kredensial diisi null. Opsi PDO::ATTR_ERRMODE bernilai PDO::ERRMODE_EXCEPTION pada contoh di bawah membuat setiap kegagalan dilempar sebagai pengecualian, dan alasannya dibahas pada bagian berikutnya.
Skrip berikut membuka koneksi, membuat satu tabel, menyisipkan satu baris, membacanya kembali, lalu menutup koneksi.
<?php
declare(strict_types=1);
$pdo = new PDO('sqlite::memory:', null, null, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
echo 'Driver: ', $pdo->getAttribute(PDO::ATTR_DRIVER_NAME), "\n";
$pdo->exec('CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT NOT NULL, penulis TEXT NOT NULL)');
$pdo->exec("INSERT INTO buku (judul, penulis) VALUES ('Algoritma Dasar', 'Citra')");
$stmt = $pdo->query('SELECT judul, penulis FROM buku');
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $baris) {
echo $baris['judul'], ' oleh ', $baris['penulis'], "\n";
}
$pdo = null;
var_dump($pdo);Driver: sqlite
Algoritma Dasar oleh Citra
NULLMetode exec() dipakai untuk pernyataan yang tidak mengembalikan baris seperti CREATE TABLE dan INSERT, sedangkan query() mengembalikan objek PDOStatement yang baris-barisnya dibaca pada perulangan. Metode getAttribute() dengan konstanta PDO::ATTR_DRIVER_NAME mengonfirmasi driver yang aktif, dan keluarannya menunjukkan sqlite. Baris terakhir memperlihatkan cara menutup koneksi, yaitu menetapkan null ke variabelnya. PDO tidak menyediakan metode close(), sehingga pelepasan referensi adalah mekanisme penutupannya, dan var_dump() menegaskan variabel tersebut sudah tidak memegang koneksi apa pun.
Mode error dan penanganan kegagalan#
Mode error menentukan apa yang dilakukan PDO ketika sebuah query gagal. Tiga nilainya adalah PDO::ERRMODE_SILENT, PDO::ERRMODE_WARNING, dan PDO::ERRMODE_EXCEPTION. Pada mode SILENT, metode seperti query() hanya mengembalikan false, dan penjelasannya dapat dibaca dari errorCode() untuk kode SQLSTATE atau errorInfo() untuk pesan lengkapnya. Mode WARNING menambahkan pesan peringatan PHP, sedangkan mode EXCEPTION melempar objek PDOException yang dapat ditangkap blok try/catch. Sejak PHP 8.0, mode bawaan PDO adalah EXCEPTION, tetapi menetapkannya secara eksplisit tetap dianjurkan agar maksud kode terbaca dan perilaku skrip sama pada versi PHP yang lebih lama.
Skrip berikut menjalankan query yang sasarannya tidak ada dengan dua mode berbeda, yaitu SILENT pada awal skrip dan EXCEPTION setelah mode diubah.
<?php
declare(strict_types=1);
$pdo = new PDO('sqlite::memory:', null, null, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT,
]);
$stmt = $pdo->query('SELECT judul FROM tabel_tidak_ada');
var_dump($stmt);
echo 'Kode SQLSTATE: ', $pdo->errorCode(), "\n";
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$pdo->query('SELECT judul FROM tabel_tidak_ada');
} catch (PDOException $e) {
echo 'Tertangkap: ', $e->getMessage(), "\n";
}bool(false)
Kode SQLSTATE: HY000
Tertangkap: SQLSTATE[HY000]: General error: 1 no such table: tabel_tidak_adaPada mode SILENT, kegagalan hanya terlihat sebagai nilai false dan kode HY000, sehingga skrip berlanjut seolah tidak terjadi apa pun. Setelah mode diubah dengan setAttribute(), kegagalan yang sama melempar PDOException yang pesannya memuat kode SQLSTATE dan pesan dari driver, yaitu no such table. Pesan semacam ini menyebut penyebabnya secara langsung, dan blok try/catch memberi tempat yang jelas untuk pemulihan atau pelaporan.
Kesalahan umum#
- Mengandalkan mode error bawaan tanpa menetapkannya. Skrip yang ditulis untuk PHP sebelum 8.0 berjalan dengan
ERRMODE_SILENT, sehingga kegagalan query tidak terlihat. TetapkanERRMODE_EXCEPTIONpada opsi koneksi agar perilakunya tidak bergantung versi. - Mengira
unset()ataunullmenutup koneksi seketika. Keduanya hanya melepas satu referensi, sedangkan koneksi benar-benar ditutup setelah referensi terakhirnya hilang. Bila koneksi disimpan di beberapa variabel atau properti, lepas semuanya atau biarkan akhir skrip menutupnya. - Memakai
exec()untuk membaca hasil query. Metodeexec()mengembalikan jumlah baris yang terpengaruh dan bukan objekPDOStatement, sehingga pembacaan baris darinya gagal. Gunakanquery()atauprepare()untuk pernyataan yang mengembalikan baris. - Menyambungkan dua koneksi ke basis data
:memory:yang dianggap sama. Setiap koneksisqlite::memory:memperoleh basis data kosong miliknya sendiri, sehingga tabel yang dibuat pada koneksi pertama tidak terlihat oleh koneksi kedua. Gunakan DSN berkas bila beberapa koneksi harus membaca data yang sama, atau teruskan satu objek koneksi yang sama ke seluruh bagian skrip.
Ringkasan#
- PDO menyatukan akses berbagai basis data di belakang kelas
PDO,PDOStatement, danPDOException, sedangkan perbedaan protokol ditangani driver sepertipdo_sqlite. - DSN menjelaskan tujuan koneksi. SQLite memakai
sqlite::memory:atau lokasi berkas, sedangkan MySQL dan PostgreSQL menyebut host, port, dan nama basis data pada DSN, lalu kredensialnya pada argumen constructor. - Mode error menentukan bentuk laporan kegagalan, dan
PDO::ERRMODE_EXCEPTIONadalah mode yang tepat karena kegagalan menjadi pengecualian yang dapat ditangkap. - Koneksi ditutup dengan melepas seluruh referensinya, misalnya
$pdo = null, atau secara otomatis ketika skrip berakhir.
Referensi#
- Connections and connection management — Manual PHP — Menjelaskan siklus hidup koneksi PDO, termasuk penutupannya dengan melepas referensi.
- PDO::__construct — Manual PHP — Mendokumentasikan DSN, kredensial, dan array opsi pada pembukaan koneksi.
- Errors and error handling — Manual PHP — Menetapkan tiga mode error PDO dan perbedaan perilakunya.
- SQLite PHP Driver — Manual PHP
— Menjelaskan DSN khusus driver SQLite, termasuk bentuk
:memory:.