Php İle Nesne Yönelimli Yapıda Dinamik Yorum Sistemi Nasıl Yapılır?

Php İle Nesne Yönelimli Yapıda Dinamik Yorum Sistemi Nasıl Yapılır?
Php İle Nesne Yönelimli Yapıda Dinamik Yorum Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu projeye başlamadan önce sisteminizde PHP 8.1 veya daha yeni bir sürümün yüklü olması önerilir. Veritabanı yönetimi için MySQL veya MariaDB kullanacağız. Ayrıca veritabanı işlemlerini yönetmek için PDO (PHP Data Objects) eklentisinin aktif olduğundan emin olun.

  • PHP 8.1+ (Tip tanımlamaları ve modern özellikler için)
  • MySQL 8.0+ veya MariaDB 10.5+
  • Composer (İsteğe bağlı, ancak PSR standartları için önerilir)
  • Temel düzeyde SQL bilgisi

Veritabanı Tasarımı ve Tablo Oluşturma

Dinamik bir yorum sistemi için öncelikle verilerin tutulacağı yapıyı kurmalıyız. Yorumlar tablosu; kullanıcının adı, yorum içeriği, ilgili gönderi ID'si ve oluşturulma tarihi gibi temel alanları içermelidir. Güvenlik için her zaman veritabanı bağlantılarını izole etmelisiniz.

CREATE TABLE comments (
    id INT AUTO_INCREMENT PRIMARY KEY,
    post_id INT NOT NULL,
    username VARCHAR(100) NOT NULL,
    comment_text TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Yukarıdaki SQL komutu, yorumları saklamak için gerekli olan tabloyu oluşturur. utf8mb4 karakter seti, emoji ve özel karakterlerin sorunsuz saklanmasını sağlar.

Veritabanı Bağlantısı İçin Database Sınıfı

OOP yapısında veritabanı bağlantısını yönetmek için bir "Singleton" veya basit bir bağlantı sınıfı kullanmak, her dosya için ayrı bağlantı açılmasını engeller. Bu, performans ve bellek yönetimi açısından en iyi uygulamadır.

class Database {
    private static ?PDO $instance = null;

    public static function getConnection(): PDO {
        if (self::$instance === null) {
            $dsn = "mysql:host=localhost;dbname=proje_db;charset=utf8mb4";
            self::$instance = new PDO($dsn, 'kullanici_adi', 'sifre', [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
            ]);
        }
        return self::$instance;
    }
}

Bu sınıf, veritabanı bağlantısını statik bir özellik olarak saklar. PDO::ATTR_ERRMODE ayarı, hataların hata nesnesi olarak fırlatılmasını sağlayarak debug sürecini kolaylaştırır.

Comment Sınıfı ile Yorum Yönetimi

Yorum ekleme ve listeleme işlemlerini yönetmek için bir CommentManager sınıfı oluşturacağız. Bu yapı, iş mantığını (business logic) veritabanı işlemlerinden ayırır. Aşağıdaki örnekte, yorum eklerken SQL Injection'a karşı hazırlanmış ifadeler (prepared statements) kullanılmıştır.

class CommentManager {
    private PDO $db;

    public function __construct(PDO $db) {
        $this->db = $db;
    }

    public function addComment(int $postId, string $username, string $text): bool {
        $stmt = $this->db->prepare("INSERT INTO comments (post_id, username, comment_text) VALUES (?, ?, ?)");
        return $stmt->execute([$postId, htmlspecialchars($username), htmlspecialchars($text)]);
    }

    public function getCommentsByPost(int $postId): array {
        $stmt = $this->db->prepare("SELECT * FROM comments WHERE post_id = ? ORDER BY created_at DESC");
        $stmt->execute([$postId]);
        return $stmt->fetchAll();
    }
}

htmlspecialchars fonksiyonu, kullanıcıdan gelen veriyi HTML karakterlerine dönüştürerek XSS (Cross-Site Scripting) saldırılarını engellemek için kullanılır. Bu, dinamik yorum sistemlerinin en kritik güvenlik adımıdır.

Dinamik Yorumları Arayüzde Listeleme

Oluşturduğumuz sınıfları kullanarak, veritabanındaki yorumları dinamik olarak sayfaya çekebiliriz. Bu adımda, sınıfın bir örneğini oluşturup verileri döngüye alacağız.

$db = Database::getConnection();
$commentManager = new CommentManager($db);
$comments = $commentManager->getCommentsByPost(1);

foreach ($comments as $comment) {
    echo "
"; echo "" . $comment['username'] . ""; echo "

" . $comment['comment_text'] . "

"; echo "
"; }

Bu kod bloğu, belirli bir yazıya (post_id: 1) ait yorumları veritabanından çeker ve basit bir HTML yapısı içerisinde ekrana basar. Veri döngüsü içerisinde her bir yorum satırı ayrı bir div bloğu içinde düzenlenmiştir.

Dinamik Yorum Sistemi Yöntem Karşılaştırması

Yöntem Avantaj Dezavantaj
OOP (Sınıflar) Modüler, test edilebilir Öğrenme eğrisi daha yüksek
Prosedürel Hızlı yazılır, basit Bakımı zor, kod tekrarı çok
Kritik Güvenlik Uyarısı: Kullanıcıdan alınan her türlü veriyi veritabanına kaydetmeden önce mutlaka temizleyin (sanitization) ve ekrana basmadan önce encode edin. SQL sorgularında asla değişkenleri doğrudan birleştirmeyin; mutlaka 'prepared statements' kullanın.

Sıkça Sorulan Sorular

Yorumları gerçek zamanlı (sayfa yenilemeden) nasıl güncelleyebilirim?

Gerçek zamanlı güncellemeler için PHP'nin yanında JavaScript (Fetch API veya AJAX) kullanmanız gerekir. PHP tarafında bir API endpoint oluşturup, JavaScript ile bu endpoint'e istek atarak verileri JSON formatında alıp DOM'a ekleyebilirsiniz.

Veritabanı bağlantısı her sayfada açılmalı mı?

Hayır, Singleton deseni veya bağımlılık enjeksiyonu (Dependency Injection) kullanarak bağlantıyı tek bir noktadan yönetmeli ve gerektiğinde paylaşmalısınız. Bu, sunucu üzerindeki bağlantı yükünü azaltır.

Yorumlarda resim veya link kullanımına nasıl izin veririm?

Kullanıcıların HTML girmesine izin vermek çok risklidir. Bunun yerine BBCode veya Markdown parser kütüphanelerini kullanarak, kullanıcı girdisini güvenli bir şekilde HTML'e dönüştürebilirsiniz.

Yorumlara cevap (reply) özelliğini nasıl eklerim?

Tablonuza parent_id adında bir sütun ekleyerek hiyerarşik bir yapı kurabilirsiniz. parent_id alanı boşsa ana yorum, doluysa bir yoruma verilen cevabı temsil eder.

Spam yorumları nasıl engellerim?

Google reCAPTCHA v3 gibi servisleri entegre ederek botların otomatik yorum yapmasını engelleyebilir veya basit bir "honeypot" (gizli input alanı) yöntemi kullanabilirsiniz.

Yorum Sisteminde Performans Optimizasyonu ve İndeksleme

Yorum sisteminiz büyüdükçe, veritabanı sorgularının hızı kullanıcı deneyimi için kritik hale gelir. Özellikle iç içe geçmiş (nested) yorum yapısında, her yorum için ayrı bir sorgu çalıştırmak "N+1" problemine yol açar. Bu sorunu aşmak için veritabanı seviyesinde indeksleme yapmalı ve verileri tek bir sorguda çekmelisiniz.

İndeksleme Stratejisi: Veritabanı tablonuzda post_id ve parent_id sütunlarına mutlaka indeks ekleyin. Bu, veritabanının tüm tabloyu taramak yerine ilgili yorumları doğrudan bulmasını sağlar.

ALTER TABLE comments ADD INDEX idx_post_parent (post_id, parent_id);

Veri Çekme Optimizasyonu: Yorumları çekerken ORDER BY created_at ASC kullanarak kronolojik bir sıra elde edin. Eğer yorum sayısı çok fazlaysa, sayfalandırma (pagination) yöntemini mutlaka uygulayın.

Yorum Sistemini Test Etme ve Hata Ayıklama

Geliştirdiğiniz sınıf yapısının kararlılığını sağlamak için PHPUnit gibi test araçlarını kullanmanız önerilir. Özellikle veritabanı işlemlerini içeren metodlar için "Mock" nesneleri kullanarak veritabanına bağlanmadan fonksiyonlarınızın mantığını test edebilirsiniz.

Hata Ayıklama İpuçları:

  • PDO Hata Modu: Veritabanı hatalarını görmek için PDO::ATTR_ERRMODE değerini PDO::ERRMODE_EXCEPTION olarak ayarlayın.
  • Loglama: Hataları kullanıcıya göstermek yerine bir log dosyasına yazdırın.
try {
    $db = new Database();
    $comment = new Comment($db->getConnection());
    $comment->save(['post_id' => 1, 'content' => 'Test yorumu']);
} catch (Exception $e) {
    error_log("Yorum kaydedilemedi: " . $e->getMessage());
    echo "Üzgünüz, bir hata oluştu. Lütfen daha sonra tekrar deneyin.";
}

İleri Düzey İpuçları: Yorumlarda Markdown Desteği

Kullanıcıların yorumlarını daha okunabilir hale getirmeleri için basit bir Markdown ayrıştırıcı (parser) entegre edebilirsiniz. Bu sayede kullanıcılar kalın, italik veya liste gibi formatları güvenli bir şekilde kullanabilirler.

Bunun için Parsedown gibi hafif ve popüler kütüphaneleri projenize dahil edebilirsiniz. Kullanıcıdan gelen veriyi veritabanına kaydederken değil, ekrana basarken dönüştürmek en güvenli yöntemdir.

// Yorumu ekrana basarken Markdown'ı HTML'e çevirme
$parser = new Parsedown();
echo $parser->text($commentData['content']);

Bu yaklaşım, veritabanınızda saf metin saklamanıza olanak tanır, böylece gelecekte farklı bir formatlama sistemine geçmek isterseniz veritabanını güncellemenize gerek kalmaz.

Sonuç

Php ile nesne yönelimli yapıda dinamik yorum sistemi kurmak, yazılım mimarinizi geliştirmek için harika bir pratik çalışmasıdır. Bu rehberde, veritabanı bağlantısından veri güvenliğine kadar temel bir akışı tamamladık. Bir sonraki adım olarak, yorumlara beğeni (like) özelliği eklemeyi veya yorumları onay mekanizmasından geçiren bir admin paneli geliştirmeyi deneyebilirsiniz. Kodunuzu her zaman PSR standartlarına uygun tutarak profesyonel bir geliştirici olma yolunda ilerleyin.

Bu yazıya tepkinizi paylaşın:
Mert Demir

Teknik konuları sadeleştirerek geniş kitlelere ulaştırma konusunda tutkuluyum. Ev işleri, bakım ve organizasyon temalı rehberlerimde kaliteyi ön planda tutuyorum.

Yorumlar (0)

Yorum Yaz