PDO (PHP Data Objects) adalah cara standar PHP berkomunikasi dengan database.
Koneksi (selalu bungkus dengan try/catch):
$dsn = "mysql:host=localhost;dbname=myapp;charset=utf8mb4";
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
try {
$pdo = new PDO($dsn, "root", "password", $options);
} catch (PDOException $e) {
// JANGAN tampilkan $e->getMessage() ke user — bisa bocor password/DSN!
error_log("DB connect failed: " . $e->getMessage());
http_response_code(500);
exit("Layanan sedang gangguan. Coba lagi nanti.");
}
Query dengan prepared statement (juga bungkus try/catch di kode produksi):
try {
// SELECT
$stmt = $pdo->prepare("SELECT * FROM users WHERE role = ?");
$stmt->execute(["admin"]);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
// INSERT
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute(["Budi", "[email protected]"]);
$id = $pdo->lastInsertId();
// UPDATE
$stmt = $pdo->prepare("UPDATE users SET name = ? WHERE id = ?");
$stmt->execute(["Budi Santoso", 1]);
// DELETE
$stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
$stmt->execute([5]);
} catch (PDOException $e) {
error_log("Query failed: " . $e->getMessage());
// Tampilkan pesan ramah ke user, JANGAN expose $e->getMessage()
exit("Terjadi kesalahan. Tim kami sudah diberi tahu.");
}
Error Handling dengan PDO:
Di PHP 8+, PDO::ERRMODE_EXCEPTION adalah default error mode — PDO akan melempar PDOException saat query gagal. Mode lain:
PDO::ERRMODE_SILENT— tidak throw, kamu harus cek$pdo->errorInfo()manual (jelek, mudah terlupa)PDO::ERRMODE_WARNING— PHP warning saja (jelek untuk produksi)
Kenapa bungkus dengan try/catch?
- Koneksi gagal (host salah, kredensial salah, DB down)
- Constraint violation (UNIQUE, foreign key)
- Deadlock dari concurrent transactions
Aturan safe error messaging:
- ❌
echo $e->getMessage();— bocorin struktur DB ke attacker - ✅
error_log($e->getMessage());ke file log, tampilkan pesan generik ke user
Named parameters (lebih jelas):
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name AND age > :age");
$stmt->execute(["name" => "Budi", "age" => 20]);
PENTING: Selalu gunakan prepared statements!
- ❌
"SELECT * FROM users WHERE id = $id"— SQL injection! - ✅
"SELECT * FROM users WHERE id = ?"+execute([$id])