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:

EkstensiDatabaseGaya API
pdokerangka antarmuka (butuh driver)OOP
pdo_sqliteSQLite melalui PDOOOP
pdo_mysqlMySQL/MariaDB melalui PDOOOP
pdo_pgsqlPostgreSQL melalui PDOOOP
mysqliMySQL/MariaDB langsungprosedural dan OOP
pgsqlPostgreSQL langsungprosedural
sqlite3SQLite langsungOOP

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
<?php
echo "Driver PDO yang tersedia di server ini:\n";
foreach (PDO::getAvailableDrivers() as $driver) {
    echo "- $driver\n";
}

Output yang Dihasilkan:

text
Driver PDO yang tersedia di server ini:
- mysql
- pgsql
- sqlite

Pada 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
<?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:

text
pdo         : aktif
pdo_sqlite  : aktif
pdo_mysql   : aktif
pdo_pgsql   : aktif
mysqli      : tidak aktif
pgsql       : aktif
sqlite3     : aktif

Fungsi 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:

AspekPDO (dengan pdo_mysql)mysqli
Database yang didukungsemua driver PDO (SQLite, MySQL, PostgreSQL, …)hanya MySQL/MariaDB
Gaya APIOOP sajaprosedural dan OOP
Placeholder bernama (:nama)adatidak ada
Prepared statementsadaada

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
<?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:

DriverContoh DSNKeterangan
sqlitesqlite::memory:database di memori, hilang saat skrip selesai
sqlitesqlite:/path/ke/toko.sqlitedatabase dalam berkas
mysqlmysql:host=127.0.0.1;port=3306;dbname=toko;charset=utf8mb4host, port, nama database, charset
pgsqlpgsql:host=localhost;port=5432;dbname=tokohost, 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 #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?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";