← Blog'a Don
PHP Dersleri

PHP Data Objects (PDO): Veritabanı İşlemleri Rehberi (Select, Insert, Update, Delete, Sayfalama)

5 ay once 5 ay once #111
PHP Data Objects (PDO): Veritabanı İşlemleri Rehberi (Select, Insert, Update, Delete, Sayfalama)

🧩 PHP Data Objects (PDO): Tüm CRUD İşlemleri, Toplam Veri ve Sayfalama (Güncel 2025 Rehberi)

Veritabanı işlemlerinde PDO (PHP Data Objects), PHP’nin en güvenli ve modern yöntemlerinden biridir.
PDO; SELECT, INSERT, UPDATE, DELETE, toplam kayıt sayısı ve sayfalama işlemlerini tek çatı altında güvenli bir şekilde yapmamıza olanak tanır.

Bu yazıda PDO’yu örneklerle öğreneceksin:
✅ SELECT (tekli ve toplu)
✅ INSERT
✅ UPDATE
✅ DELETE (tekli ve toplu)
✅ Toplam veri sayısı
✅ Sayfalama (İlk – Önceki – Sonraki – Son)


⚙️ 1. PDO Nedir?

PDO, PHP’nin veritabanı işlemleri için geliştirdiği nesne tabanlı (OOP) bir arabirimdir.
Avantajları:

  • 🔐 Güvenli (SQL Injection’a karşı koruma sağlar)

  • ⚙️ Çoklu veritabanı desteği (MySQL, PostgreSQL, SQLite...)

  • 💡 Nesne yönelimli yapı

  • 🧩 Prepared statement desteği


🔌 2. PDO ile Veritabanı Bağlantısı

<?php try { $db = new PDO("mysql:host=localhost;dbname=blog;charset=utf8", "root", ""); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "✅ Veritabanı bağlantısı başarılı!"; } catch (PDOException $e) { echo "❌ Hata: " . $e->getMessage(); } ?>

💡 ERRMODE_EXCEPTION sayesinde hataları kolayca yakalayıp yönetebilirsin.


🧠 3. INSERT (Yeni Veri Ekleme)

<?php $sorgu = $db->prepare("INSERT INTO kullanicilar (ad, email, yas) VALUES (?, ?, ?)"); $ekle = $sorgu->execute(["Metin", "metin@example.com", 31]); if ($ekle) { echo "✅ Yeni kullanıcı eklendi!"; } else { echo "❌ Ekleme başarısız!"; } ?>

💡 prepare() + execute() kullanımı güvenlidir; SQL Injection riskini ortadan kaldırır.


📖 4. SELECT (Toplu Veri Listeleme)

<?php $sorgu = $db->query("SELECT * FROM kullanicilar ORDER BY id DESC"); $kullanicilar = $sorgu->fetchAll(PDO::FETCH_ASSOC); foreach ($kullanicilar as $kisi) { echo $kisi["id"] . " - " . $kisi["ad"] . " (" . $kisi["email"] . ")<br>"; } ?>

🔹 fetchAll() tüm kayıtları getirir.
🔹 PDO::FETCH_ASSOC sadece sütun adlarını döndürür (index numaralarını değil).


🔍 5. SELECT (Tekli Veri Getirme)

<?php $sorgu = $db->prepare("SELECT * FROM kullanicilar WHERE id = ?"); $sorgu->execute([3]); $kisi = $sorgu->fetch(PDO::FETCH_ASSOC); if ($kisi) { echo "👤 " . $kisi["ad"] . " - " . $kisi["email"] . " (" . $kisi["yas"] . " yaşında)"; } else { echo "Kayıt bulunamadı!"; } ?>

💡 fetch() yalnızca tek satır veri döndürür.


🧮 6. UPDATE (Veri Güncelleme)

<?php $sorgu = $db->prepare("UPDATE kullanicilar SET ad = ?, yas = ? WHERE id = ?"); $guncelle = $sorgu->execute(["Ahmet", 31, 3]); if ($guncelle) { echo "✅ Kayıt güncellendi!"; } else { echo "❌ Güncelleme başarısız!"; } ?>

🗑️ 7. DELETE (Tekli Silme)

<?php $sorgu = $db->prepare("DELETE FROM kullanicilar WHERE id = ?"); $sil = $sorgu->execute([3]); if ($sil) { echo "🗑️ Kayıt silindi!"; } ?>

🧹 8. DELETE (Toplu Silme)

<?php $ids = [2, 4, 5]; $placeholders = str_repeat('?,', count($ids) - 1) . '?'; $sorgu = $db->prepare("DELETE FROM kullanicilar WHERE id IN ($placeholders)"); $sorgu->execute($ids); echo "✅ Seçilen kayıtlar silindi!"; ?>

🔹 IN() ifadesiyle birden fazla ID tek sorguda silinebilir.


📊 9. Toplam Kayıt Sayısı

<?php $sorgu = $db->query("SELECT COUNT(*) as toplam FROM kullanicilar"); $sonuc = $sorgu->fetch(PDO::FETCH_ASSOC); echo "📈 Toplam kullanıcı sayısı: " . $sonuc["toplam"]; ?>

📄 10. SAYFALAMA (Pagination)

Büyük veri listelerinde kullanıcıya sayfa sayfa görüntüleme imkanı vermek gerekir.
Aşağıda PDO ile dinamik sayfalama sistemi örneği vardır:

<?php // 1️⃣ Sayfa ve Limit Ayarları $limit = 5; // Sayfa başına kayıt sayısı $sayfa = isset($_GET['sayfa']) ? (int)$_GET['sayfa'] : 1; if ($sayfa < 1) $sayfa = 1; $baslangic = ($sayfa - 1) * $limit; // 2️⃣ Toplam Sayfa Hesaplama $toplamSorgu = $db->query("SELECT COUNT(*) as toplam FROM kullanicilar"); $toplamKayit = $toplamSorgu->fetch(PDO::FETCH_ASSOC)['toplam']; $sayfaSayisi = ceil($toplamKayit / $limit); // 3️⃣ Kayıtları Getir $sorgu = $db->prepare("SELECT * FROM kullanicilar ORDER BY id DESC LIMIT :baslangic, :limit"); $sorgu->bindValue(":baslangic", $baslangic, PDO::PARAM_INT); $sorgu->bindValue(":limit", $limit, PDO::PARAM_INT); $sorgu->execute(); $kullanicilar = $sorgu->fetchAll(PDO::FETCH_ASSOC); // 4️⃣ Verileri Listele foreach ($kullanicilar as $kisi) { echo $kisi["id"] . " - " . $kisi["ad"] . " (" . $kisi["yas"] . " yaşında)<br>"; } // 5️⃣ Sayfa Linkleri echo "<div style='margin-top:15px;'>"; if ($sayfa > 1) { echo "<a href='?sayfa=1'>İlk Sayfa</a> "; echo "<a href='?sayfa=" . ($sayfa - 1) . "'>Önceki</a> "; } for ($i = 1; $i <= $sayfaSayisi; $i++) { $aktif = ($i == $sayfa) ? "style='font-weight:bold;color:red;'" : ""; echo "<a $aktif href='?sayfa=$i'> $i </a> "; } if ($sayfa < $sayfaSayisi) { echo "<a href='?sayfa=" . ($sayfa + 1) . "'>Sonraki</a> "; echo "<a href='?sayfa=$sayfaSayisi'>Son Sayfa</a>"; } echo "</div>"; ?>

🔹 Örnek Çıktı:

1 - Metin (31 yaşında) 2 - Ahmet (28 yaşında) 3 - Ayşe (24 yaşında) ... İlk Sayfa Önceki 1 2 3 4 Sonraki Son Sayfa

💡 Kullanıcı, “İlk Sayfa” veya “Son Sayfa” bağlantılarıyla hızlıca başa veya sona gidebilir.
Aktif sayfa renkli ve kalın olarak vurgulanır.


⚡ 11. PDO ile Güvenli Kodlama İpuçları

Hazırlanmış sorgular (prepare()) kullan, doğrudan değişkenleri sorguya yazma.
✅ Her execute() sonrası bool dönüşünü kontrol et.
Veri tiplerini belirt: PDO::PARAM_INT, PDO::PARAM_STR
✅ Hataları yönetmek için try...catch bloğunu kullan.
✅ Kullanıcı girdilerini htmlspecialchars() ile temizle.


🏁 SONUÇ

Artık PDO ile tüm temel veritabanı işlemlerini güvenli bir şekilde yapabiliyorsun:

İşlemAçıklama
INSERTYeni veri ekler
SELECTVeri okur (tekli veya toplu)
UPDATEKayıt günceller
DELETEKayıt siler (tekli veya çoklu)
COUNTToplam kayıt sayısını döndürür
LIMIT + OFFSETSayfalama sistemini oluşturur

PDO, hem güvenli hem de performanslı yapısıyla modern PHP projelerinde vazgeçilmezdir.
Bu yapı sayesinde uygulamanın hem profesyonel hem de sürdürülebilir hale gelir. 💪