PHP’de PDO (PHP Data Objects), çeşitli veritabanlarına güvenli ve esnek bir şekilde bağlanmak ve onlarla etkileşimde bulunmak için kullanılan bir veritabanı erişim katmanıdır. PDO’nun en önemli avantajları arasında güvenlik, esneklik ve taşınabilirlik yer alır. PDO, çeşitli veritabanı sürücüleri ile çalışabilir ve sadece bir API kullanarak farklı veritabanı türlerine geçiş yapmanıza olanak tanır (MySQL, PostgreSQL, SQLite vb.).
PDO’nun Temel Özellikleri:
Veritabanı soyutlama: Farklı veritabanlarıyla çalışabilirsiniz (MySQL, PostgreSQL, SQLite, vb.). Veritabanını değiştirdiğinizde, sadece bağlantı bilgilerini değiştirmeniz gerekir, kodun geri kalanı aynı kalabilir.
Hazırlanmış ifadeler (Prepared Statements): SQL enjeksiyonuna karşı daha güvenlidir ve performansı artırır.
Veritabanı hatalarını yönetmek için istisnalar (exceptions): PDO, hataları daha kolay yönetmenizi sağlar.
Çeşitli hata modları: PDO hataları farklı modlarda yönetebilir (örneğin, istisna atma, uyarı verme veya sessiz kalma).
PDO ile MySQL’e Bağlanma
PDO kullanarak bir veritabanına bağlanmak için PDO sınıfını kullanırız. Bağlantı kurulurken, veritabanı sunucusu adresi, veritabanı adı, kullanıcı adı ve parola gibi bağlantı bilgileri gereklidir.
<?php // Veritabanı bağlantı bilgileri $host = 'localhost'; $db = 'veritabani_adi'; $user = 'kullanici_adi'; $pass = 'parola'; $charset = 'utf8mb4'; // DSN (Data Source Name) - PDO'ya nasıl bağlanacağını söylüyor $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Hataları istisna olarak atar PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // Varsayılan veri çekme modunu ayarlar PDO::ATTR_EMULATE_PREPARES => false, // Gerçek hazırlanan ifadeleri kullanır ]; try { // PDO nesnesi oluşturma ve bağlantı yapma $pdo = new PDO($dsn, $user, $pass, $options); echo "Veritabanına başarılı şekilde bağlandı!"; } catch (PDOException $e) { // Bağlantı hatası durumunda yakalama echo "Veritabanı bağlantı hatası: " . $e->getMessage(); } ?>
Hazırlanmış İfadeler (Prepared Statements)
Hazırlanmış ifadeler, PDO’nun önemli bir güvenlik özelliğidir. SQL sorgularında kullanıcı girdilerini doğrudan yerleştirmek yerine, PDO’nun yer tutucuları (placeholders) kullanmasına olanak tanır. Bu sayede SQL enjeksiyonu gibi saldırılar önlenmiş olur.
Hazırlanmış ifadeler iki şekilde kullanılabilir: adlandırılmış yer tutucular (:param) ve soru işareti yer tutucuları (?).
Örnek: Adlandırılmış Yer Tutucular ile Kayıt Ekleme
<?php $sql = "INSERT INTO users (username, email, password) VALUES (:username, :email, :password)"; $stmt = $pdo->prepare($sql); // Veriler $username = 'exampleUser'; $email = 'user@example.com'; $password = password_hash('secret', PASSWORD_DEFAULT); // Parametreleri bağlama ve sorguyu çalıştırma $stmt->execute([ ':username' => $username, ':email' => $email, ':password' => $password, ]); echo "Kayıt başarılı!"; ?>
Örnek: Soru İşareti Yer Tutucuları ile Veri Çekme
<?php $sql = "SELECT * FROM users WHERE id = ?"; $stmt = $pdo->prepare($sql); // Parametreyi yerleştirme ve sorguyu çalıştırma $stmt->execute([1]); // Sonuçları çekme $user = $stmt->fetch(); print_r($user); ?>
Veritabanından Veri Çekme
PDO ile veritabanından veri çekmek için fetch() ve fetchAll() yöntemleri kullanılır.
fetch(): Tek bir satırı çeker.
fetchAll(): Tüm satırları çeker.
Örnek: Veri Çekme (fetch)
<?php $sql = "SELECT * FROM users WHERE id = ?"; $stmt = $pdo->prepare($sql); $stmt->execute([1]); // Tek satır çekme $user = $stmt->fetch(PDO::FETCH_ASSOC); print_r($user); ?>
Örnek: Tüm Verileri Çekme (fetchAll)
<?php $sql = "SELECT * FROM users"; $stmt = $pdo->query($sql); // Tüm satırları çekme $users = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($users as $user) { echo $user['username'] . '<br>'; } ?>
Güncelleme ve Silme İşlemleri
PDO ile güncelleme ve silme işlemleri de oldukça basittir.
Örnek: Kayıt Güncelleme
<?php $sql = "UPDATE users SET email = :email WHERE id = :id"; $stmt = $pdo->prepare($sql); $stmt->execute([ ':email' => 'newemail@example.com', ':id' => 1, ]); echo "Kayıt güncellendi!"; ?>
Örnek: Kayıt Silme
<?php $sql = "DELETE FROM users WHERE id = :id"; $stmt = $pdo->prepare($sql); $stmt->execute([':id' => 1]); echo "Kayıt silindi!"; ?>
Hata Yönetimi
PDO’nun sunduğu üç farklı hata modu vardır:
PDO::ERRMODE_SILENT: PDO hatalarını sessizce işler (varsayılan mod). PDO::ERRMODE_WARNING: Hataları uyarı olarak gösterir. PDO::ERRMODE_EXCEPTION: Hataları istisna (exception) olarak fırlatır. Bu mod en yaygın kullanılan ve önerilen moddur. Hata yönetimi için PDO'nun istisna modunu aktif hale getirerek hataları daha profesyonel bir şekilde işleyebilirsiniz.
Bağlantıyı Kapatma
PDO’da, bağlantıyı manuel olarak kapatmaya gerek yoktur. PDO nesnesi, tüm işlemler tamamlandıktan sonra otomatik olarak kapanır. Ancak isterseniz PDO nesnesini null yaparak bağlantıyı hemen kapatabilirsiniz.
$pdo = null;
PDO ile Avantajlar
Güvenlik: Hazırlanmış ifadeler (Prepared Statements) SQL enjeksiyonuna karşı güvenlik sağlar.
Taşınabilirlik: PDO, aynı kodun farklı veritabanlarında kullanılabilmesine olanak tanır.
Performans: Hazırlanmış ifadeler sık kullanılan sorgularda performans artışı sağlar.
Esneklik: Farklı hata modları ve veri çekme modları ile esneklik sunar.
PDO, modern PHP uygulamalarında güvenli ve taşınabilir veritabanı erişimi sağlamak için en çok tercih edilen yöntemlerden biridir.