Php İle Pdo Kullanarak Crud İşlemleri Nasıl Yapılır?

Php İle Pdo Kullanarak Crud İşlemleri Nasıl Yapılır?
Php İle Pdo Kullanarak Crud İşlemleri Nasıl Yapılır?

PHP ile PDO Kullanarak CRUD İşlemleri Nasıl Yapılır?

PHP dünyasında veritabanı yönetimi söz konusu olduğunda, modern ve güvenli standartları takip etmek kritik öneme sahiptir. PHP ile PDO (PHP Data Objects) kullanarak CRUD işlemleri nasıl yapılır sorusu, veritabanı ile etkileşime giren her geliştiricinin temel öğrenme basamağıdır. CRUD; Create (Oluşturma), Read (Okuma), Update (Güncelleme) ve Delete (Silme) işlemlerini ifade eden, uygulamalarınızın veri katmanını yönetmenizi sağan dört temel fonksiyondur.

Bu rehberde, 2026 standartlarına uygun olarak, SQL injection saldırılarına karşı korumalı ve sürdürülebilir bir veritabanı yapısının nasıl kurulacağını adım adım inceleyeceğiz. PDO, sadece MySQL değil, birçok farklı veritabanı sürücüsüyle çalışabilen esnek bir arayüz sunduğu için günümüzde endüstri standardı kabul edilmektedir.

Gereksinimler ve Ön Hazırlık

Başarılı bir uygulama geliştirmek için sisteminizde PHP 8.2 veya daha güncel bir sürümün yüklü olması önerilir. PDO, PHP kurulumunuzla birlikte gelen bir eklentidir, ancak kullandığınız veritabanı sürücüsünün (örneğin pdo_mysql) aktif olduğundan emin olmalısınız.

  • PHP 8.2+ yüklü bir yerel sunucu ortamı (XAMPP, Laragon veya Docker).
  • Temel düzeyde SQL bilgisi.
  • Veritabanı yönetimi için phpMyAdmin veya bir terminal arayüzü.

Projenize başlamadan önce, veritabanı bağlantısını tek bir noktadan yönetmek, kod tekrarını önlemek ve güvenlik açıklarını kapatmak için en iyi pratiktir.

PDO ile Güvenli Veritabanı Bağlantısı Kurma

PDO kullanmanın en büyük avantajı, "Prepared Statements" (Hazırlanmış İfadeler) desteğidir. Bu özellik, kullanıcıdan gelen verilerin doğrudan sorguya dahil edilmesini engelleyerek SQL injection riskini ortadan kaldırır. İlk adım olarak bağlantı dosyamızı oluşturalım.

Bu kod bloğunda, PDO::ERRMODE_EXCEPTION ile hataların yakalanmasını sağlıyor ve ATTR_EMULATE_PREPARES => false ile veritabanının kendi hazırlık mekanizmasını kullanmaya zorluyoruz. Bu, güvenlik açısından kritik bir yapılandırmadır.

Veri Ekleme (Create): Yeni Kayıt Oluşturma

Veritabanına veri eklerken, kullanıcıdan gelen verileri asla doğrudan sorgu içine yazmamalısınız. Bunun yerine yer tutucular (placeholder) kullanarak veriyi güvenli bir şekilde göndeririz.

$sql = "INSERT INTO kullanicilar (ad, email) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute(['Ahmet Yılmaz', 'ahmet@example.com']);

echo "Yeni kayıt başarıyla eklendi. ID: " . $pdo->lastInsertId();

Burada ? işaretleri, execute metoduna gönderdiğimiz dizideki değerlerle güvenli bir şekilde değiştirilir. Bu yöntem, verinin kötü niyetli kodlar içermesini engeller.

Veri Okuma (Read): Kayıtları Listeleme

Veritabanından veri çekerken, ihtiyacımız olan kadarını almak performans açısından önemlidir. Tüm verileri çekmek yerine, filtreleme veya sıralama kullanarak sorgularımızı optimize etmeliyiz.

$stmt = $pdo->query("SELECT id, ad, email FROM kullanicilar");
while ($row = $stmt->fetch()) {
    echo "İsim: " . htmlspecialchars($row['ad']) . " - Email: " . htmlspecialchars($row['email']) . "
"; }

htmlspecialchars() fonksiyonu, veritabanından gelen veriyi ekrana basarken XSS (Cross-Site Scripting) saldırılarını önlemek için mutlaka kullanılmalıdır.

Veri Güncelleme (Update) ve Silme (Delete)

Güncelleme ve silme işlemleri, genellikle bir ID üzerinden yapılır. Bu işlemlerde mutlaka WHERE koşulunu kullanmalısınız; aksi takdirde tüm veritabanını yanlışlıkla silebilir veya güncelleyebilirsiniz.

// Güncelleme
$sql = "UPDATE kullanicilar SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute(['email' => 'yeni@mail.com', 'id' => 1]);

// Silme
$sql = "DELETE FROM kullanicilar WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([1]);

Burada isimli parametreleri (:email) kullanarak kodun okunabilirliğini artırdık. İsimli parametreler, özellikle çok fazla sütunun olduğu tablolarda hata yapma riskini azaltır.

CRUD Yöntemlerinin Karşılaştırması

Yöntem Avantajı Dezavantajı
PDO Güvenli, taşınabilir, nesne yönelimli Başlangıçta öğrenme eğrisi vardır
MySQLi Hızlı, sadece MySQL için optimize Diğer DB sistemlerine taşınamaz
Eski mysql_* Yok Güvensiz, PHP 7+ ile tamamen kaldırıldı

Güvenlik Uyarısı: Üretim ortamında asla veritabanı hatalarını kullanıcıya göstermeyin. try-catch bloklarını kullanarak hataları log dosyalarına yazdırın ve kullanıcıya genel bir hata mesajı sunun.

Sıkça Sorulan Sorular

PDO neden MySQLi'den daha iyidir?

PDO, farklı veritabanı sistemleri arasında geçiş yaparken kodunuzu değiştirmenize gerek kalmadan çalışmanıza olanak tanır. Ayrıca, daha modern ve güvenli bir sözdizimi sunar.

SQL Injection nedir ve PDO bunu nasıl engeller?

SQL Injection, kullanıcı girdilerinin sorguya doğrudan dahil edilmesiyle veritabanı komutlarının manipüle edilmesidir. PDO, hazırlanmış ifadeler (prepared statements) kullanarak veriyi sorgudan ayırır ve verinin sadece değer olarak işlenmesini sağlar.

Prepared Statements kullanımı zorunlu mu?

Evet, kullanıcıdan gelen herhangi bir veriyi sorguda kullanıyorsanız, güvenlik için hazırlanmış ifadeler kullanmak bir zorunluluktur.

Veritabanı bağlantı bilgilerini nerede saklamalıyım?

Bağlantı bilgilerinizi asla doğrudan kodun içine yazmayın. .env dosyaları veya kod dizininizin dışında kalan yapılandırma dosyalarında tutarak güvenliği artırın.

PDO ile işlem (transaction) nasıl yapılır?

Birden fazla sorgunun bir bütün olarak çalışması gerektiğinde $pdo->beginTransaction(), $pdo->commit() ve $pdo->rollBack() metotlarını kullanarak veri bütünlüğünü sağlayabilirsiniz.

PDO ile Hata Ayıklama ve Hata Yönetimi

Veritabanı işlemleri sırasında oluşabilecek hataları yönetmek, uygulamanızın çökmesini engellemek ve kullanıcıya anlamlı geri bildirimler sunmak için kritik öneme sahiptir. PDO, varsayılan olarak hataları sessizce geçebilir veya PHP hata raporlama seviyenize bağlı olarak ekrana dökebilir. Profesyonel bir uygulamada, PDO::ATTR_ERRMODE özelliğini kullanarak hataları istisna (exception) olarak yakalamak en iyi yöntemdir.

Try-Catch Bloğu ile Hata Yakalama

Veritabanı bağlantısı ve sorgu işlemleri sırasında oluşan hataları yönetmek için try-catch bloklarını kullanmalısınız. Bu sayede veritabanı sunucusu kapalı olsa bile kullanıcıya "Veritabanı bağlantısı kurulamadı" gibi şık bir mesaj gösterebilirsiniz.

try {
    $pdo = new PDO("mysql:host=localhost;dbname=test_db;charset=utf8", "kullanici", "sifre");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $pdo->prepare("INSERT INTO kullanicilar (ad, email) VALUES (?, ?)");
    $stmt->execute(['Ahmet', 'ahmet@example.com']);
} catch (PDOException $e) {
    // Hata günlüğüne yazma
    error_log("Veritabanı Hatası: " . $e->getMessage());
    // Kullanıcıya dostça mesaj
    die("Üzgünüz, şu anda bir teknik sorun yaşıyoruz. Lütfen daha sonra tekrar deneyin.");
}

PDO Performansını Optimize Etme İpuçları

PDO, veritabanı ile PHP arasındaki köprüdür. Büyük ölçekli uygulamalarda veritabanı sorgularının performansını artırmak için PDO'nun sunduğu bazı özel ayarları yapılandırmak gerekir. Özellikle PDO::ATTR_EMULATE_PREPARES ayarı, sorgu performansında önemli bir fark yaratabilir.

Hazırlanmış İfadelerin Emülasyonunu Kapatmak

Varsayılan olarak, bazı PDO sürücüleri hazırlanmış ifadeleri (prepared statements) emüle eder. Bu, sorgunun veritabanına gönderilmeden önce PHP tarafında işlenmesi anlamına gelir. Güvenliği artırmak ve veritabanı sunucusunun sorgu planlayıcısından tam verim almak için emülasyonu kapatmak önerilir.

// Emülasyonu kapatarak veritabanı sunucusunun native prepare özelliğini kullanın
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

// Sorgu sonuçlarını nesne olarak almak yerine dizi olarak çekmek bellek tasarrufu sağlar
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

Büyük Veri Setlerinde Bellek Yönetimi

Binlerce satırlık veriyi tek seferde fetchAll() ile çekmek, PHP'nin bellek limitlerini zorlayabilir. Bunun yerine, verileri satır satır işlemek için fetch() metodunu bir döngü içerisinde kullanmak çok daha performanslıdır.

$stmt = $pdo->query("SELECT * FROM cok_buyuk_tablo");

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['ad'] . "
"; // Belleği boşaltmak için her iterasyonda işlem yapın }

Bu yöntem, özellikle raporlama sistemlerinde veya CSV dışa aktarma işlemlerinde uygulamanızın memory_limit hatası almasını engeller.

Sonuç

PHP ile PDO kullanarak CRUD işlemleri yapmak, hem profesyonel bir yazılım geliştirme disiplini kazanmanızı sağlar hem de uygulamalarınızı modern güvenlik standartlarına uygun hale getirir. Bu rehberde öğrendiğiniz temel yapıları, daha karmaşık projelerde (örneğin bir kullanıcı yönetim sistemi veya blog altyapısı) rahatlıkla kullanabilirsiniz. Bir sonraki adım olarak, veritabanı işlemlerini daha modüler hale getirmek için "Repository Pattern" (Depo Tasarım Deseni) üzerine çalışmanızı öneririm.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Uygulamalarınızı yayına almadan önce güvenlik denetimlerinden geçirmeli ve güncel güvenlik kütüphanelerini kullanmalısınız.

Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Adım adım rehber hazırlama ve kullanıcı deneyimi odaklı içerik mimarisi konusunda yetkinim. Okuyucuların sorunlarını hızlı çözen, net ve uygulanabilir metinler üretmeyi seviyorum.

Yorumlar (0)

Yorum Yaz