Tutorial PHP #28: PDO di PHP untuk Akses Database
1. Apa itu PDO?
PDO (PHP Data Objects) adalah extension PHP untuk mengakses database dengan cara yang konsisten, terlepas dari jenis database yang digunakan. Kelebihan PDO dibanding MySQLi:
- Multi-database - bisa ganti dari MySQL ke PostgreSQL, SQLite, dll hanya dengan ubah connection string
- Prepared statement yang lebih fleksibel - parameter bisa diisi dengan nama (
:nama) bukan hanya posisi (?) - Exception-based error handling - lebih mudah di-debug
2. Koneksi PDO
<?php
// db.php
$dsn = "mysql:host=localhost;dbname=db_belajar;charset=utf8mb4";
$user = "root";
$pass = "";
try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // throw exception saat error
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // fetch sebagai associative array
PDO::ATTR_EMULATE_PREPARES => false, // pakai prepared statement native
]);
// echo "Koneksi PDO berhasil";
} catch (PDOException $e) {
die("Koneksi gagal: " . $e->getMessage());
}
?>
3. SELECT dengan PDO
<?php
require_once "db.php";
// Ambil semua data
$stmt = $pdo->query("SELECT * FROM users ORDER BY id DESC");
$users = $stmt->fetchAll(); // fetchAll() = ambil semua baris sekaligus
foreach ($users as $user) {
echo "{$user['nama']} - {$user['email']} <br>";
}
// Ambil data dengan kondisi - pakai prepared statement
$id = 1;
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(["id" => $id]);
$user = $stmt->fetch(); // fetch() = ambil satu baris
if ($user) {
echo "Ditemukan: {$user['nama']}";
} else {
echo "User tidak ditemukan";
}
?>
4. INSERT dengan PDO
<?php
require_once "db.php";
function createUser(PDO $pdo, string $nama, string $email, string $password): int {
$stmt = $pdo->prepare(
"INSERT INTO users (nama, email, password) VALUES (:nama, :email, :password)"
);
$stmt->execute([
"nama" => $nama,
"email" => $email,
"password" => password_hash($password, PASSWORD_DEFAULT),
]);
return (int) $pdo->lastInsertId();
}
$newId = createUser($pdo, "Ariq", "ariq@mail.com", "secret123");
echo "User baru ID: $newId";
?>
5. UPDATE dan DELETE
<?php
require_once "db.php";
// UPDATE
function updateUser(PDO $pdo, int $id, string $nama, string $email): bool {
$stmt = $pdo->prepare("UPDATE users SET nama = :nama, email = :email WHERE id = :id");
$stmt->execute(["nama" => $nama, "email" => $email, "id" => $id]);
return $stmt->rowCount() > 0;
}
// DELETE
function deleteUser(PDO $pdo, int $id): bool {
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->execute(["id" => $id]);
return $stmt->rowCount() > 0;
}
if (updateUser($pdo, 1, "Ariq Updated", "newmail@mail.com")) {
echo "User berhasil diupdate";
}
?>
6. Transaction di PDO
Transaction memastikan semua operasi berhasil sebelum data benar-benar disimpan - jika salah satu gagal, semua dibatalkan.
<?php
require_once "db.php";
try {
$pdo->beginTransaction();
// Kurangi stok produk
$stmt1 = $pdo->prepare("UPDATE produk SET stok = stok - :qty WHERE id = :id");
$stmt1->execute(["qty" => 2, "id" => 5]);
// Tambah record penjualan
$stmt2 = $pdo->prepare("INSERT INTO penjualan (produk_id, qty) VALUES (:pid, :qty)");
$stmt2->execute(["pid" => 5, "qty" => 2]);
$pdo->commit(); // semua berhasil, simpan permanen
echo "Transaksi berhasil";
} catch (PDOException $e) {
$pdo->rollBack(); // ada yang gagal, batalkan semua
echo "Transaksi dibatalkan: " . $e->getMessage();
}
?>
7. Ringkasan
- PDO lebih fleksibel dari MySQLi - mendukung banyak jenis database
- Gunakan named parameter (
:nama) untuk prepared statement yang lebih readable - Set
PDO::ERRMODE_EXCEPTIONagar error langsung throw exception - Transaction berguna untuk operasi database yang harus berhasil semua atau gagal semua
Tutorial berikutnya membahas authentication login register dengan PHP.
.jpg)
