Php İle Veritabanı Destekli Dinamik Bir Ürün Varyasyon Yönetimi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu projeyi hayata geçirmek için bilgisayarınızda PHP 8.2 veya üzeri bir sürümün yüklü olması önerilir. Veritabanı yönetim sistemi olarak MySQL veya MariaDB kullanacağız. Ayrıca, veritabanı bağlantılarını yönetmek için bir yapılandırma dosyasına ihtiyacımız olacak.

  • PHP 8.2+ (Tip güvenli kodlama için gereklidir)
  • MySQL 8.0+ veya MariaDB 10.6+
  • PDO eklentisi aktif bir sunucu ortamı
  • Temel SQL ve PHP bilgisi

Veritabanı Şemasını Tasarlama

Dinamik varyasyon yönetimi için "EAV" (Entity-Attribute-Value) modeline yakın ancak daha performanslı olan ilişkisel bir yapı kullanacağız. İki ana tabloya ihtiyacımız var: products ve product_variants.

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    base_price DECIMAL(10, 2) NOT NULL
);

CREATE TABLE product_variants (
    id INT AUTO_INCREMENT PRIMARY KEY,
    product_id INT NOT NULL,
    attribute_name VARCHAR(50), -- Örn: Renk
    attribute_value VARCHAR(50), -- Örn: Kırmızı
    price_modifier DECIMAL(10, 2) DEFAULT 0.00,
    stock_quantity INT DEFAULT 0,
    FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
);

Bu yapı, her varyasyonun ana ürüne bağlı olmasını sağlar. price_modifier alanı, varyasyonun ana fiyata eklenip eklenmeyeceğini belirler.

PDO ile Veritabanı Bağlantısı

Güvenlik için veritabanı bağlantısını bir sınıf veya ayrı bir dosya içinde tutmak en iyi pratiktir. PDO, SQL injection saldırılarını önlemek adına hazırlanan ifadeleri (prepared statements) destekler.

Bu kod bloğu, veritabanına güvenli bir bağlantı kurar ve hata raporlamayı aktif hale getirir. Hataların kullanıcıya gösterilmemesi için üretim ortamında PDO::ERRMODE_SILENT tercih edilebilir.

Dinamik Varyasyonları Listeleme

Ürün sayfasında varyasyonları göstermek için ana ürün ID'sine göre product_variants tablosundan veri çekmeliyiz. Aşağıdaki kod, belirli bir ürünün tüm varyasyonlarını getirir.

Burada htmlspecialchars() fonksiyonu kullanılarak XSS (Cross-Site Scripting) saldırıları engellenmiştir. Veritabanından gelen verinin doğrudan HTML içine basılması güvenlik zafiyetidir.

Varyasyon Yönetimi Karşılaştırma Tablosu

Yöntem Avantaj Dezavantaj
İlişkisel Tablo (Önerilen) Veri bütünlüğü yüksek, sorgulama hızlı. Karmaşık join işlemleri gerektirir.
JSON Sütunu Esnek yapı, hızlı prototipleme. Stok takibi ve filtreleme zorlaşır.

Varyasyon Ekleme ve Güncelleme

Varyasyon yönetimi sadece okumayı değil, yönetici panelinden yeni varyasyonlar eklemeyi de kapsar. Aşağıdaki örnek, bir varyasyonun nasıl ekleneceğini gösterir.

Bu işlem, veritabanına yeni bir varyasyon satırı ekler. prepared statement kullanımı sayesinde kullanıcıdan gelen veriler doğrudan sorguya dahil edilmez, böylece SQL injection engellenir.

Güvenlik Uyarısı: Üretim ortamında veritabanı işlemlerini gerçekleştirmeden önce mutlaka kullanıcı yetkilendirmesi (authentication) ve yetki kontrolü (authorization) yapın. Veritabanı şifrelerini asla kod içinde açık metin olarak tutmayın; .env dosyaları veya güvenli yapılandırma yöneticileri kullanın.

Sıkça Sorulan Sorular

Varyasyonlar için neden ayrı bir tablo kullanmalıyım?

Ana ürün tablosunu şişirmemek ve stok takibini varyasyon bazlı (örneğin sadece M beden tükendiğinde M bedeni sepete ekletmemek) yapabilmek için ayrı tablo şarttır.

Stok takibini nasıl güncel tutabilirim?

Sipariş tamamlandığında UPDATE product_variants SET stock_quantity = stock_quantity - 1 WHERE id = ? sorgusunu kullanarak stoktan düşüş yapmalısınız.

Fiyatları nasıl dinamik hesaplarım?

Ana ürün fiyatı ile price_modifier değerini toplayarak toplam satış fiyatını elde edebilirsiniz.

Performans için ne yapmalıyım?

product_id sütununa indeks (INDEX) eklemek, varyasyon sorgularını çok daha hızlı hale getirecektir.

JSON veri tipi ile varyasyon tutulabilir mi?

Evet, ancak SQL ile karmaşık stok filtreleme işlemleri yaparken JSON sütunları ilişkisel tablolar kadar performanslı değildir.

Varyasyon Yönetiminde Hata Ayıklama ve Loglama

Dinamik sistemlerde en sık karşılaşılan sorun, veritabanındaki stok miktarı ile kullanıcının sepete eklediği ürünün uyuşmamasıdır. Bu tür tutarsızlıkları gidermek için her varyasyon güncelleme işlemini bir log tablosunda kayıt altına almalısınız.

Aşağıdaki örnek, bir varyasyon güncellendiğinde değişikliği veritabanına işleyen ve aynı zamanda bir log dosyasına yazan güvenli bir fonksiyon yapısını göstermektedir:

function updateVariationStock($pdo, $variation_id, $new_stock) {
    try {
        $pdo->beginTransaction();

        $stmt = $pdo->prepare("UPDATE product_variations SET stock = ? WHERE id = ?");
        $stmt->execute([$new_stock, $variation_id]);

        $logMessage = "[" . date('Y-m-d H:i:s') . "] Varyasyon ID: $variation_id, Yeni Stok: $new_stock\n";
        file_put_contents('logs/stock_changes.log', $logMessage, FILE_APPEND);

        $pdo->commit();
        return true;
    } catch (Exception $e) {
        $pdo->rollBack();
        error_log("Stok güncelleme hatası: " . $e->getMessage());
        return false;
    }
}

İleri Seviye: Varyasyonlar İçin Cache (Önbellekleme) Stratejisi

E-ticaret sitelerinde ürün varyasyonları, sayfa yüklendiğinde en çok sorgulanan verilerdir. Her sayfa yenilemesinde veritabanına gitmek, özellikle trafik arttığında sunucuyu yoracaktır. Redis veya Memcached kullanarak varyasyon verilerini bellekte tutmak, sorgu süresini milisaniyeler seviyesine indirir.

Aşağıda, Redis kullanarak varyasyon verilerini önbelleğe alma mantığı yer almaktadır:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cacheKey = "product_variations_" . $product_id;

if ($redis->exists($cacheKey)) {
    $variations = json_decode($redis->get($cacheKey), true);
} else {
    $stmt = $pdo->prepare("SELECT * FROM product_variations WHERE product_id = ?");
    $stmt->execute([$product_id]);
    $variations = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // Veriyi 1 saat boyunca önbellekte tut
    $redis->setex($cacheKey, 3600, json_encode($variations));
}
Profesyonel İpucu: Varyasyon tablosunda bir güncelleme yaptığınızda (stok veya fiyat değişikliği), mutlaka ilgili product_id'ye ait cache anahtarını $redis->del($cacheKey) komutu ile temizlemeyi unutmayın. Aksi takdirde kullanıcılar eski fiyatları görmeye devam edecektir.

Varyasyon Yönetimi İçin Test Senaryoları

Sisteminizi canlıya almadan önce aşağıdaki senaryoları mutlaka test etmelisiniz:

  • Negatif Stok Testi: Stok miktarı 0'ın altına düşmeye zorlandığında veritabanı kısıtlamasının çalışıp çalışmadığını kontrol edin.
  • Eşzamanlılık (Concurrency) Testi: Aynı anda iki kullanıcı son kalan 1 ürünü sepete eklemeye çalıştığında sistemin nasıl tepki verdiğini (Race Condition) gözlemleyin.
  • Fiyat Manipülasyonu: Kullanıcının tarayıcı üzerinden gönderdiği variation_id değerini değiştirerek, yetkisi olmayan bir fiyata erişip erişemediğini doğrulayın (Server-side validation).

Sonuç

PHP ile dinamik bir ürün varyasyon yönetimi kurmak, veritabanı tasarımı ve güvenli kodlama pratiklerinin birleştiği bir süreçtir. Bu rehberde öğrendiğiniz ilişkisel tablo yapısı ve PDO kullanımı, profesyonel e-ticaret projelerinin temelini oluşturur. Bir sonraki adım olarak, bu yapıya "Sepet" mantığını entegre ederek, kullanıcının seçtiği varyasyonun fiyatını ve stok durumunu sepete yansıtmayı deneyebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Deniz Arslan

Yedi yıllık dijital içerik deneyimiyle karmaşık süreçleri herkesin anlayabileceği basit adımlara dönüştürüyorum. Pratik yaşam hackleri ve ev yönetimi konularında uzmanım.

Yorumlar (0)

Yorum Yaz