Php İle Dinamik Bir Ürün Karşılaştırma Modülü Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Modülü oluşturmaya başlamadan önce geliştirme ortamınızın hazır olduğundan emin olmalısınız. PHP 8.2 veya daha güncel bir sürüm, veritabanı yönetimi için MySQL (veya MariaDB) ve yerel bir sunucu (XAMPP, Laragon veya Docker tabanlı yapılar) gereklidir.

  • PHP 8.x: Modern sözdizimi ve tip güvenliği (type-hinting) için gereklidir.
  • PDO (PHP Data Objects): Veritabanı işlemlerinde SQL Injection saldırılarını önlemek için zorunludur.
  • Session Yönetimi: Seçilen ürün ID'lerini tarayıcı oturumunda tutmak için kullanılır.

Veritabanı Yapısının Kurulması

Dinamik bir karşılaştırma modülü için ürünlerin özelliklerini tutan bir tabloya ihtiyacımız var. Aşağıdaki SQL sorgusu, ürünlerin isimlerini, fiyatlarını ve teknik özelliklerini içeren temel bir tablo yapısı oluşturur.

CREATE TABLE urunler (
    id INT AUTO_INCREMENT PRIMARY KEY,
    urun_adi VARCHAR(255) NOT NULL,
    fiyat DECIMAL(10, 2) NOT NULL,
    islemci VARCHAR(100),
    ram VARCHAR(50),
    depolama VARCHAR(50),
    ekran_karti VARCHAR(100)
);

Bu tablo yapısı, ürünleri karşılaştırırken satır bazlı veri çekmemizi kolaylaştıracaktır. DECIMAL veri tipi, finansal verilerin hassasiyetini korumak için en doğru tercihtir.

Ürünleri Karşılaştırma Listesine Ekleme

Kullanıcı bir ürünü karşılaştırmak istediğinde, bu ürünün ID'sini PHP oturumuna (session) eklemeliyiz. Bu işlem için add_to_compare.php adında bir dosya oluşturarak gelen isteği karşılayalım.

session_start();

if (isset($_POST['urun_id'])) {
    $id = (int)$_POST['urun_id'];
    
    // Eğer session boşsa dizi oluştur
    if (!isset($_SESSION['karsilastir'])) {
        $_SESSION['karsilastir'] = [];
    }
    
    // Aynı ürünün tekrar eklenmesini engelle ve sınır koy (örn: maks 4 ürün)
    if (!in_array($id, $_SESSION['karsilastir']) && count($_SESSION['karsilastir']) < 4) {
        $_SESSION['karsilastir'][] = $id;
    }
}
header('Location: karsilastirma.php');
exit;

Burada (int) tip dönüşümü kullanarak gelen veriyi temizliyoruz. Ayrıca count() kontrolü ile kullanıcının aynı anda çok fazla ürünü karşılaştırıp arayüzü bozmasını engelliyoruz.

Karşılaştırma Tablosunu Dinamik Oluşturma

Şimdi, oturumda tutulan ID'leri kullanarak veritabanından ürün bilgilerini çekelim ve bunları bir HTML tablosunda listeleyelim. Bu işlem için karsilastirma.php dosyasını kullanacağız.

require 'db.php'; // Veritabanı bağlantısı

$ids = $_SESSION['karsilastir'] ?? [];
$urunler = [];

if (!empty($ids)) {
    $placeholders = implode(',', array_fill(0, count($ids), '?'));
    $sql = "SELECT * FROM urunler WHERE id IN ($placeholders)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute($ids);
    $urunler = $stmt->fetchAll(PDO::FETCH_ASSOC);
}

Burada prepare ve execute kullanarak SQL Injection riskini tamamen ortadan kaldırıyoruz. array_fill fonksiyonu, dinamik sayıda ID için güvenli sorgu oluşturmamızı sağlar.

HTML Arayüzü ve Veri Gösterimi

Verileri tabloya aktarırken, ürün özelliklerini satırlara yerleştirmeliyiz. Aşağıdaki kod, veritabanından gelen verileri şık bir tablo yapısıyla ekrana basar.

Özellik
Fiyat TL
İşlemci

htmlspecialchars() fonksiyonu, XSS (Cross-Site Scripting) saldırılarını engellemek için hayati önem taşır. Kullanıcı tarafından girilen verileri ekrana basarken her zaman bu fonksiyonu kullanmalısınız.

Karşılaştırma Yöntemleri Karşılaştırması

Yöntem Avantajı Dezavantajı
Session Tabanlı Hızlı, sunucu yükü az. Oturum kapanınca veriler silinir.
Veritabanı Tabanlı Kalıcı, kullanıcı girişi ile eşleşir. Daha fazla veritabanı sorgusu gerektirir.
LocalStorage (JS) Sunucuya yük bindirmez. SEO uyumlu değildir, botlar göremez.
Kritik Güvenlik Uyarısı: Üretim ortamında (production) veritabanı bağlantı bilgilerini asla kod içerisinde açık metin olarak bulundurmayın. `.env` dosyalarını kullanın ve veritabanı kullanıcısına sadece gerekli yetkileri (SELECT, INSERT) tanımlayın.

Sıkça Sorulan Sorular

Karşılaştırma modülüne aynı anda kaç ürün eklenmeli?

Kullanıcı deneyimi açısından 3 veya 4 ürün idealdir. Daha fazla ürün, tablonun mobil cihazlarda okunamaz hale gelmesine neden olur.

Kullanıcı sayfayı yenileyince ürünler silinir mi?

Eğer verileri $_SESSION içerisinde tutuyorsanız, kullanıcı tarayıcıyı kapatana kadar veriler korunur. Kalıcı olması için veritabanında "karşılaştırma listesi" tablosu oluşturmalısınız.

Mobil uyumluluk için ne yapmalıyım?

Tablo yapısını CSS overflow-x: auto; özelliği ile sarmalayarak mobil cihazlarda sağa-sola kaydırılabilir hale getirebilirsiniz.

SQL Injection'dan nasıl korunurum?

Her zaman PDO veya MySQLi kütüphanelerinde "Prepared Statements" (hazırlanmış ifadeler) kullanarak veritabanı sorgularınızı oluşturun.

Bu modülü Laravel gibi bir framework ile yapabilir miyim?

Evet, mantık aynıdır. Laravel'de Session::push() ve Eloquent ORM kullanarak bu süreci çok daha hızlı ve güvenli bir şekilde yönetebilirsiniz.

Performans Optimizasyonu ve Önbellekleme Stratejileri

Ürün karşılaştırma modülleri, özellikle veritabanında çok sayıda ürün ve karmaşık özellikler (attributes) bulunduğunda sunucu üzerinde ek yük oluşturabilir. Kullanıcı her karşılaştırma sayfasına girdiğinde tüm ürün verilerini veritabanından çekmek yerine, performans odaklı yaklaşımlar sergilemelisiniz.

Redis ile Oturum Verilerini Yönetme

Standart PHP oturumları (session) dosya sisteminde tutulur. Yüksek trafikli bir e-ticaret sitesinde, karşılaştırma listelerini Redis gibi bir bellek içi (in-memory) veri deposunda tutmak, disk I/O yükünü ciddi oranda azaltır. Aşağıdaki örnek, Redis kullanarak ürün ID'lerini nasıl hızlıca yönetebileceğinizi gösterir:


// Redis bağlantısı (PhpRedis eklentisi gerektirir)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$sessionId = session_id();
$key = "compare_list:" . $sessionId;

// Ürün ekleme
$redis->sAdd($key, $productId);

// Listeyi çekme
$compareList = $redis->sMembers($key);

Veritabanı Sorgularını Optimize Etme

Karşılaştırma tablosunu oluştururken WHERE IN operatörünü kullanmak, her ürün için ayrı sorgu atmaktan çok daha verimlidir. Sorgu sayısını bire indirmek için şu yapıyı kullanın:


// Güvenli sorgu hazırlığı
$ids = implode(',', array_map('intval', $_SESSION['compare']));
$sql = "SELECT * FROM products WHERE id IN ($ids)";
$stmt = $pdo->query($sql);
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);

Hata Ayıklama ve Geliştirici İpuçları

Dinamik modüller geliştirirken karşılaşılan en yaygın sorun, oturum verilerinin senkronize olmaması veya ürün özelliklerinin eksik gelmesidir. Bu süreçte uygulamanızı daha dayanıklı hale getirecek yöntemler şunlardır:

  • Veri Tutarlılığı Kontrolü: Kullanıcı karşılaştırma listesine bir ürün ekledikten sonra ürün veritabanından silinirse, modül hata verebilir. Her zaman if ($product) kontrolü yaparak var olmayan ürünlerin listeyi bozmasını engelleyin.
  • Karakter Kodlaması: Ürün özelliklerini (teknik detaylar) JSON formatında saklıyorsanız, veritabanından çekerken json_decode fonksiyonunun hata verip vermediğini json_last_error() ile kontrol edin.
  • Log Kayıtları: Kullanıcıların karşılaştırma modülünü ne sıklıkla kullandığını anlamak için basit bir loglama mekanizması kurun. Bu, hangi ürünlerin daha çok karşılaştırıldığını analiz ederek satış stratejinizi belirlemenize yardımcı olur.

// JSON hata ayıklama örneği
$attributes = json_decode($product['attributes'], true);
if (json_last_error() !== JSON_ERROR_NONE) {
    error_log("Ürün ID: " . $product['id'] . " için JSON verisi bozuk.");
    $attributes = [];
}
İpucu: Geliştirme aşamasında error_reporting(E_ALL); komutunu aktif ederek tüm uyarıları görünür kılın, ancak canlı ortamda (production) bu ayarı mutlaka kapatın ve hataları bir dosyaya yönlendirin.

Sonuç

Bu rehberde, PHP kullanarak dinamik bir ürün karşılaştırma modülünün temel mantığını, veritabanı işlemlerini ve güvenlik önlemlerini adım adım inceledik. Modern yazılım geliştirme süreçlerinde, yazdığınız kodun sadece çalışması değil, aynı zamanda güvenli ve sürdürülebilir olması da önemlidir. Bir sonraki adım olarak, bu modüle "karşılaştırmadan kaldır" butonu ekleyerek kullanıcı etkileşimini artırabilir ve AJAX kullanarak sayfa yenilemeden ürün ekleme özelliğini geliştirebilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Uygulamanızı canlıya almadan önce tüm girişleri (input) doğrulamalı (validation) ve güvenlik testlerini yapmalısınız.
Bu yazıya tepkinizi paylaşın:
Kerem Tekin

Teknik rehberler ve dijital araçların verimli kullanımı konusunda uzmanlaşmış bir editörüm. Karmaşık teknolojik süreçleri, herkesin kolayca uygulayabileceği rehberlere dönüştürerek zaman tasarrufu sağlamayı hedefliyorum.

Yorumlar (0)

Yorum Yaz