PHP ile PDO Veritabanı Bağlantısı Nasıl Yapılır? (Adım Adım Örnekli Kodlar)
Bu rehberde PHP PDO kullanarak veritabanı bağlantısını adım adım öğreneceksiniz. Güvenli prepared statement kullanımı, hata yönetimi, transaction uygulamaları ve en iyi uygulama ipuçları ile basit bir bağlantıdan gerçek dünya örneklerine kadar kapsamlı bir yol haritası sunulmuştur.
Hazırlık: Başlamadan Önce
- PDO eklentisinin yüklü olduğundan emin olun. phpinfo() ile PDO ve ilgili sürücüler (pdo_mysql, pdo_pgsql, pdo_sqlite vb.) kontrol edilebilir.
- Veritabanı kullanıcı bilgileri (host, dbname, kullanıcı, şifre) hazır olsun.
- Karakter seti için utf8mb4 kullanılması önerilir; böylece emoji ve çok baytlı karakterler güvenli şekilde saklanır.
Adım 1 — Basit Bağlantı (MySQL Örneği)
Aşağıdaki örnek en temel PDO bağlantısını gösterir. Hata modu istisna (exception) olacak şekilde ayarlanmıştır.
<?php
$dsn = 'mysql:host=127.0.0.1;dbname=testdb;charset=utf8mb4';
$user = 'dbuser';
$pass = 'secret';
try {
$pdo = new PDO($dsn, $user, $pass);
// Hata yönetimini exception olarak ayarla
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Varsayılan fetch modunu assosiative dizi yap
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
echo 'Bağlantı başarılı';
} catch (PDOException $e) {
// Gerçek projelerde mesajı loglayın, kullanıcıya ham hata gösterilmeyecek
echo 'Bağlantı hatası: ' . $e->getMessage();
}
?>
Adım 2 — Prepared Statement ile Sorgu (SQL Injection'dan Korunma)
Prepared statement kullanarak parametre bağlamak güvenlik ve performans açısından önemlidir.
<?php
$email = '[email protected]';
$stmt = $pdo->prepare('SELECT id, name, email FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();
if ($user) {
// Kullanıcı bulundu
} else {
// Bulunamadı
}
?>
BindParam vs BindValue
- bindValue değeri anında bağlar (literal değer uygundur).
- bindParam değişken referansını bağlar; execute anındaki değeri alır (özellikle döngülerde dikkat gerekir).
Adım 3 — Veri Okuma Yöntemleri
- fetch(): Tek bir satır döndürür.
- fetchAll(): Tüm sonucu dizi halinde döndürür (büyük veri setlerinde dikkatli olunmalıdır).
- fetchColumn(): Tek bir sütun değeri almak için kullanışlıdır.
- Varsayılan fetch modu olarak PDO::FETCH_ASSOC genelde daha okunabilir sonuç verir.
Adım 4 — Transaction (İşlem Yönetimi)
Birkaç sorgunun atomik olarak çalışması gerektiğinde transaction kullanın. Hata durumunda rollback ile geri alırsınız.
<?php
try {
$pdo->beginTransaction();
$pdo->prepare('UPDATE accounts SET balance = balance - 100 WHERE id = :id')->execute([':id' => 1]);
$pdo->prepare('UPDATE accounts SET balance = balance + 100 WHERE id = :id')->execute([':id' => 2]);
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
// Hata loglanmalı
echo 'İşlem başarısız: ' . $e->getMessage();
}
?>
Adım 5 — Kapanış ve Kaynak Yönetimi
PDO nesnesini kapatmak için değişkeni null yapmanız yeterlidir. PHP betik sonlandığında bağlantı otomatik kapanır, ancak uzun yaşayan uygulamalarda açık bağlantıları manuel kapatmak iyi pratiktir.
<?php
$pdo = null; // Bağlantıyı sonlandırır
?>
İyi Uygulamalar ve Performans İpuçları
- Karakter setini belirtin: DSN içinde charset=utf8mb4 kullanın.
- Hata yönetimi: Üretimde detaylı hataları doğrudan ekrana basmayın; loglayın.
- Prepared statement kullanın: SQL injection riskini azaltır ve bazı durumlarda performans sağlar.
- Büyük veri setlerinde: fetchAll yerine döngü ile fetch kullanın veya sayfalandırma (pagination) uygulayın.
- Persistent connection: PDO'da kalıcı bağlantılar olabilir, ancak dikkatli kullanılmalıdır; kaynak sızıntılarına ve beklenmedik durumlara yol açabilir.
- Bağımsız erişim katmanı: Veritabanı erişimini tek bir sınıfa/sınırlı fonksiyona toplayın; yeniden kullanılabilirlik ve test edilebilirlik artar.
Örnek: Basit Bir Database Sınıfı
<?php
class Database {
private $pdo;
public function __construct($dsn, $user, $pass) {
$this->pdo = new PDO($dsn, $user, $pass);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}
public function query($sql, $params = []) {
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return $stmt;
}
public function fetchAll($sql, $params = []) {
return $this->query($sql, $params)->fetchAll();
}
public function __destruct() {
$this->pdo = null;
}
}
// Kullanım
$dsn = 'mysql:host=127.0.0.1;dbname=testdb;charset=utf8mb4';
$db = new Database($dsn, 'dbuser', 'secret');
$users = $db->fetchAll('SELECT id, name FROM users');
?>
Sonuç
PDO, PHP'de modern, güvenli ve esnek bir veritabanı erişim aracı sağlar. Bu rehberdeki adımları izleyerek güvenli bağlantı kurabilir, prepared statement ve transaction gibi mekanizmalarla veritabanı işlemlerinizi sağlam temellere oturtabilirsiniz. Uygulamalarınızı modüler bir erişim katmanına taşıyarak bakım ve test süreçlerini kolaylaştırın. İyi bir logging, uygun hata yönetimi ve karakter seti seçimi veritabanı entegrasyonunuzun sürekliliğini sağlar.