Php İle Web Sitesi İçin Dinamik Sıkça Sorulan Sorular Modülü Nasıl Yapılır?

Php İle Web Sitesi İçin Dinamik Sıkça Sorulan Sorular Modülü Nasıl Yapılır?
Php İle Web Sitesi İçin Dinamik Sıkça Sorulan Sorular Modülü Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. Dinamik bir modül için ihtiyaç duyacağınız temel araçlar şunlardır:

  • PHP 8.1 veya daha yeni bir sürüm (Performans ve güvenlik iyileştirmeleri için).
  • MySQL veya MariaDB veritabanı sunucusu.
  • PDO eklentisi aktif bir PHP yapılandırması.
  • Temel HTML ve CSS bilgisi.

Veritabanı bağlantısı için bir config.php dosyası oluşturarak işe başlayalım. Bu dosya, veritabanı ile PHP arasındaki güvenli köprüyü kuracaktır.

Veritabanı Tasarımı ve Tablo Oluşturma

Dinamik bir SSS modülünün kalbi veritabanıdır. Soruları ve cevapları saklamak için esnek bir tablo yapısına ihtiyacımız vardır. Aşağıdaki SQL sorgusu, soruların sıralanabilir ve aktif/pasif durumlarının yönetilebilir olduğu bir tablo oluşturur.


CREATE TABLE sss (
    id INT AUTO_INCREMENT PRIMARY KEY,
    soru VARCHAR(255) NOT NULL,
    cevap TEXT NOT NULL,
    sira INT DEFAULT 0,
    durum TINYINT(1) DEFAULT 1,
    olusturulma_tarihi TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Bu yapıda sira sütunu soruların hangi sırada görüneceğini belirlerken, durum sütunu yayından kaldırmak istediğiniz soruları silmeden gizlemenize olanak tanır.

PHP ile Verileri Çekme ve Güvenlik

Verileri veritabanından çekerken SQL Injection saldırılarına karşı hazırlıklı olmalıyız. PDO kullanarak hazırlanan ifadeler (prepared statements), veritabanı sorgularınızı koruma altına alır. Aşağıdaki örnek, aktif olan soruları sıralı bir şekilde çeker.

Bu kod bloğu, veritabanındaki aktif tüm soruları $sss_listesi değişkenine dizi olarak aktarır. ORDER BY sira ASC komutu, veritabanında belirlediğiniz sıralamaya göre verilerin gelmesini sağlar.

SSS Modülünü Arayüzde Listeleme

Verileri çektikten sonra bunları kullanıcıya şık bir şekilde sunmak gerekir. HTML ve PHP'yi iç içe kullanarak verileri döngüye alacağız. XSS (Cross-Site Scripting) saldırılarını engellemek için ekrana yazdırdığımız verileri htmlspecialchars() fonksiyonu ile süzmek hayati önem taşır.


nl2br() fonksiyonu, veritabanındaki metin alanında kullandığınız satır başlarını HTML'deki
etiketlerine dönüştürerek içeriğin düzgün görünmesini sağlar.

Dinamik Yönetim Paneli Mantığı

Sistemin "dinamik" olması, bir yönetici panelinden soru ekleyebilmeniz anlamına gelir. Yeni bir soru eklemek için basit bir form ve bu formu işleyen bir PHP dosyası gerekir. Aşağıda soru ekleme işleminin temel mantığını gösteren kod bulunmaktadır.


if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $soru = $_POST['soru'];
    $cevap = $_POST['cevap'];
    
    $sql = "INSERT INTO sss (soru, cevap) VALUES (?, ?)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$soru, $cevap]);
    echo "Soru başarıyla eklendi.";
}

Bu kod, kullanıcıdan gelen veriyi doğrudan sorguya yerleştirmek yerine ? yer tutucularını kullanır. Bu sayede veritabanı güvenliği en üst düzeyde tutulmuş olur.

Yöntem Karşılaştırması

Yöntem Avantaj Dezavantaj
Statik HTML Hızlı yükleme Güncellemesi zor
PHP + MySQL Dinamik, yönetilebilir Veritabanı bağlantısı gerektirir
JSON Dosyası Veritabanı gerektirmez Büyük verilerde yavaşlar
Kritik Güvenlik Uyarısı: Veritabanı bağlantı bilgilerini içeren dosyalarınızı (config.php gibi) asla halka açık dizinlerde veya sürüm kontrol sistemlerinde (Git gibi) açık metin olarak paylaşmayın. Kullanıcı girişlerini mutlaka doğrulayın ve filtreleyin.

SSS Modülü İçin Performans Optimizasyonu

Dinamik olarak veritabanından çekilen SSS verileri, özellikle soru sayısı arttığında sayfa yüklenme sürelerini olumsuz etkileyebilir. Kullanıcı deneyimini iyileştirmek ve sunucu üzerindeki yükü azaltmak için aşağıdaki stratejileri uygulayabilirsiniz.

Önbellekleme (Caching) Stratejisi

SSS verileri sık değişen içerikler değildir. Bu nedenle, veritabanına her sayfa yüklenişinde sorgu atmak yerine, veriyi bir kez çekip bir dosyada veya Redis/Memcached gibi bir sistemde saklayabilirsiniz.


// Basit bir dosya tabanlı önbellekleme örneği
$cacheFile = 'cache/sss_data.json';
$cacheTime = 3600; // 1 saat

if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < $cacheTime)) {
    $sssData = json_decode(file_get_contents($cacheFile), true);
} else {
    $stmt = $pdo->query("SELECT soru, cevap FROM sss ORDER BY sira ASC");
    $sssData = $stmt->fetchAll(PDO::FETCH_ASSOC);
    file_put_contents($cacheFile, json_encode($sssData));
}

Hata Ayıklama ve Loglama Teknikleri

Geliştirme aşamasında veritabanı bağlantı hatalarını veya SQL sözdizimi hatalarını kullanıcıya göstermek güvenlik açığı yaratır. Bunun yerine, hataları sunucu tarafında bir log dosyasında tutmalısınız.

PDO Hata Modu Yapılandırması

PDO nesnesini oluştururken hata modunu ERRMODE_EXCEPTION olarak ayarlamak, hataları try-catch blokları ile yakalamanızı sağlar.


try {
    $pdo = new PDO("mysql:host=localhost;dbname=proje_db;charset=utf8", "user", "pass", [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);
} catch (PDOException $e) {
    error_log("Veritabanı Hatası: " . $e->getMessage());
    die("Üzgünüz, bir sistem hatası oluştu. Lütfen daha sonra tekrar deneyin.");
}

İleri Seviye İpuçları: Arama ve Filtreleme

Kullanıcıların geniş bir SSS listesinde aradıkları cevabı hızlıca bulabilmeleri için veritabanı seviyesinde bir arama mekanizması eklemek oldukça değerlidir. SQL'in LIKE operatörü ile basit bir arama fonksiyonu şu şekilde kurgulanabilir:

Özellik Açıklama
Full-Text Search Büyük veri setlerinde MATCH() AGAINST() kullanın.
Debounce Arama kutusuna yazarken JavaScript ile gecikme ekleyin.

// Arama sorgusu örneği
$search = "%" . $_GET['q'] . "%";
$stmt = $pdo->prepare("SELECT * FROM sss WHERE soru LIKE :q OR cevap LIKE :q");
$stmt->execute(['q' => $search]);
$sonuclar = $stmt->fetchAll();

Bu yöntemle, kullanıcılarınızın sadece listelemekle kalmayıp, içerik içerisinde anahtar kelime bazlı arama yapmalarını sağlayarak modülünüzü daha işlevsel hale getirebilirsiniz.

Sonuç

PHP ile dinamik bir SSS modülü oluşturmak, hem veritabanı yönetimi hem de güvenli kod yazma pratiklerini pekiştirmek için mükemmel bir projedir. Bu rehberde öğrendiğiniz PDO kullanımı, SQL sorguları ve veri filtreleme teknikleri, geliştireceğiniz diğer tüm PHP projeleri için temel oluşturacaktır. Bir sonraki adım olarak, bu modüle bir "Akordiyon" (Accordion) efekti eklemek için JavaScript kütüphanelerini inceleyebilir veya yönetici paneline sürükle-bırak sıralama özelliği ekleyerek kullanıcı deneyimini daha profesyonel bir seviyeye taşıyabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Emre Yılmaz

Bilgi odaklı nasıl yapılır içerikleriyle karmaşık süreçleri herkes için anlaşılır kılıyorum. Okuyucularımın zamanını verimli kullanmalarını sağlayan stratejiler geliştiriyorum.

Yorumlar (0)

Yorum Yaz