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_decodefonksiyonunun hata verip vermediğinijson_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.

Yorumlar (0)
Yorum Yaz