PHP inti (PHP core) sama sekali tidak tahu cara berbicara dengan MySQL, PostgreSQL, maupun SQLite. Kemampuan itu dibawa oleh ekstensi yang dikompilasi ke dalam binary PHP, dan tiap ekstensi menyediakan driver untuk database tertentu. Sebelum menulis kode akses data, kita perlu tahu ekstensi apa saja yang tersedia di server tempat kode berjalan, karena daftar ini bisa berbeda antar instalasi. Chapter ini memetakan lanskap ekstensi database di PHP, menunjukkan cara memeriksanya dari dalam kode, dan membantu kita memilih antara PDO dan ekstensi native seperti mysqli.
Ekstensi dan Driver Database #
Ekstensi (extension) adalah modul yang menambah kemampuan PHP — misalnya pdo_mysql menambah kemampuan berbicara dengan MySQL melalui antarmuka PDO. Ekstensi database di PHP terbagi dalam dua keluarga besar:
| Ekstensi | Database | Gaya API |
|---|---|---|
pdo | kerangka antarmuka (butuh driver) | OOP |
pdo_sqlite | SQLite melalui PDO | OOP |
pdo_mysql | MySQL/MariaDB melalui PDO | OOP |
pdo_pgsql | PostgreSQL melalui PDO | OOP |
mysqli | MySQL/MariaDB langsung | prosedural dan OOP |
pgsql | PostgreSQL langsung | prosedural |
sqlite3 | SQLite langsung | OOP |
Keluarga pertama adalah ekstensi pdo beserta driver-drivernya (pdo_sqlite, pdo_mysql, pdo_pgsql). Ekstensi pdo sendiri hanyalah kerangka antarmuka; tanpa minimal satu driver, PDO tidak bisa terhubung ke database mana pun. Keluarga kedua adalah ekstensi native yang menghubungi server database tertentu tanpa melalui PDO — mysqli untuk MySQL, pgsql untuk PostgreSQL, dan class SQLite3 untuk SQLite. Kedua keluarga ini akan kita bandingkan setelah tahu cara memeriksa ketersediaannya.
Melihat Driver yang Tersedia #
Daftar driver yang terpasang tidak boleh dikira-kira — tanyakan langsung ke PHP. Metode statis PDO::getAvailableDrivers() mengembalikan array berisi nama semua driver PDO yang aktif:
<?php
echo "Driver PDO yang tersedia di server ini:\n";
foreach (PDO::getAvailableDrivers() as $driver) {
echo "- $driver\n";
}Output yang Dihasilkan:
Driver PDO yang tersedia di server ini:
- mysql
- pgsql
- sqlitePada build PHP yang dipakai course ini, tiga driver aktif: mysql, pgsql, dan sqlite — masing-masing disediakan oleh ekstensi pdo_mysql, pdo_pgsql, dan pdo_sqlite. Nama driver inilah yang nantinya ditulis di awal DSN (string alamat koneksi) saat membuka koneksi PDO. Untuk memeriksa ekstensi (termasuk yang native), gunakan fungsi extension_loaded():
<?php
$yangDicek = ["pdo", "pdo_sqlite", "pdo_mysql", "pdo_pgsql", "mysqli", "pgsql", "sqlite3"];
foreach ($yangDicek as $nama) {
echo str_pad($nama, 12) . ": " . (extension_loaded($nama) ? "aktif" : "tidak aktif") . "\n";
}Output yang Dihasilkan:
pdo : aktif
pdo_sqlite : aktif
pdo_mysql : aktif
pdo_pgsql : aktif
mysqli : tidak aktif
pgsql : aktif
sqlite3 : aktifFungsi extension_loaded() menerima nama ekstensi dan mengembalikan true bila ekstensi aktif; hasilnya digabung menjadi kalimat status dengan operator ternary. Dari terminal, informasi yang sama bisa dilihat dengan php -m yang mencetak seluruh ekstensi aktif, atau php --ri pdo yang menampilkan bagian khusus PDO termasuk daftar drivernya.
mysqli atau PDO #
Karena mysqli dan pdo_mysql sama-sama mengakses MySQL, pemula sering bingung memilih. Perbandingannya dapat dirangkum dalam tabel berikut:
| Aspek | PDO (dengan pdo_mysql) | mysqli |
|---|---|---|
| Database yang didukung | semua driver PDO (SQLite, MySQL, PostgreSQL, …) | hanya MySQL/MariaDB |
| Gaya API | OOP saja | prosedural dan OOP |
Placeholder bernama (:nama) | ada | tidak ada |
| Prepared statements | ada | ada |
PDO unggul pada portabilitas: kode yang ditulis untuk SQLite cukup ganti DSN untuk berpindah ke MySQL atau PostgreSQL. mysqli tetap relevan ketika program membutuhkan fitur spesifik MySQL — misalnya mysqli_multi_query() untuk menjalankan beberapa perintah sekaligus, atau kontrol halus atas buffered/unbuffered result. Berikut wujud perbedaan gaya koneksi keduanya (contoh memerlukan server MySQL yang sedang berjalan):
<?php
// MySQL melalui PDO — butuh server MySQL yang aktif
$pdoMysql = new PDO(
"mysql:host=127.0.0.1;port=3306;dbname=toko;charset=utf8mb4",
"budi",
"YOUR_DATABASE_PASSWORD"
);
// MySQL melalui mysqli — API berbeda untuk tujuan yang sama
$mysqli = new mysqli("127.0.0.1", "budi", "YOUR_DATABASE_PASSWORD", "toko");PDO memakai satu constructor dengan DSN sebagai parameter pertama, sementara mysqli memakai parameter terpisah untuk host, kredensial, dan nama database. Keduanya berhasil menghubungi server yang sama; perbedaannya ada pada API setelahnya — objek PDO versus objek mysqli. Untuk seluruh course ini kita memakai PDO sebagai alat utama, dan alasan strategisnya dibahas pada chapter PDO
.
Ringkasan DSN per Driver #
Nama driver yang dikembalikan PDO::getAvailableDrivers() dipakai di awal string DSN. Tabel berikut merangkum bentuk DSN untuk tiga driver yang tersedia di build ini:
| Driver | Contoh DSN | Keterangan |
|---|---|---|
sqlite | sqlite::memory: | database di memori, hilang saat skrip selesai |
sqlite | sqlite:/path/ke/toko.sqlite | database dalam berkas |
mysql | mysql:host=127.0.0.1;port=3306;dbname=toko;charset=utf8mb4 | host, port, nama database, charset |
pgsql | pgsql:host=localhost;port=5432;dbname=toko | host, port, nama database |
Format umumnya adalah namaDriver:opsi=nilai;opsi=nilai — setiap driver menentukan sendiri opsi yang dimengertinya. Anatomi DSN ini sampai ke detail (nama pengguna, kata sandi, array opsi, dan penanganan kegagalan koneksi) dibedah tuntas pada chapter PDO Connections
.
Kapan Ekstensi Native Dibutuhkan #
Sebagian besar aplikasi — termasuk framework besar seperti Laravel dan Symfony — memilih PDO karena satu API untuk semua database, dukungan prepared statements yang seragam, dan perilaku error yang konsisten. Ekstensi native dipakai saat PDO tidak cukup: mysqli untuk fitur khusus MySQL seperti multi-query, pgsql untuk fitur PostgreSQL seperti COPY dan LISTEN/NOTIFY, serta SQLite3 bila ingin database tertanam tanpa antarmuka PDO sama sekali. Keputusannya sederhana: mulai dengan PDO, dan jatuh ke ekstensi native hanya ketika ada fitur spesifik database yang benar-benar dibutuhkan.
Ringkasan #
PHP mengakses database melalui ekstensi: keluarga PDO (pdo plus driver pdo_sqlite, pdo_mysql, pdo_pgsql) dan ekstensi native (mysqli, pgsql, sqlite3). Ketersediaan driver dapat diperiksa lewat PDO::getAvailableDrivers() dan extension_loaded(), bukan dikira-kira. Dengan peta ini di tangan, kita siap membedah PDO itu sendiri — antarmuka tunggal yang akan menjadi senjata utama kita sepanjang section ini — pada chapter berikutnya.
Referensi #
- PDO Drivers (php.net)
- PDO::getAvailableDrivers() (php.net)
- mysqli — Improved MySQL Extension (php.net)
- get_loaded_extensions() (php.net)
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
/**
* contoh.php - rangkuman Chapter Database Drivers.
*
* Memeriksa driver PDO dan ekstensi database yang aktif, lalu
* membuktikan driver sqlite bekerja lewat koneksi SQLite memori.
*/
echo "== Driver PDO ==\n";
foreach (PDO::getAvailableDrivers() as $driver) {
echo "- $driver\n";
}
echo "== Ekstensi terkait database ==\n";
$yangDicek = ["pdo", "pdo_sqlite", "pdo_mysql", "pdo_pgsql", "mysqli", "pgsql", "sqlite3"];
foreach ($yangDicek as $nama) {
echo str_pad($nama, 12) . ": " . (extension_loaded($nama) ? "aktif" : "tidak aktif") . "\n";
}
echo "== Uji coba driver sqlite ==\n";
$pdo = new PDO("sqlite::memory:");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("CREATE TABLE cek (pesan TEXT)");
$pdo->exec("INSERT INTO cek (pesan) VALUES ('pdo_sqlite bekerja')");
echo $pdo->query("SELECT pesan FROM cek")->fetchColumn() . "\n";