Php İle Nesne Yönelimli Yapıda Dinamik Site İçi Arama Kaydı Nasıl Yapılır?

Php İle Nesne Yönelimli Yapıda Dinamik Site İçi Arama Kaydı Nasıl Yapılır?
Php İle Nesne Yönelimli Yapıda Dinamik Site İçi Arama Kaydı Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu projeyi hayata geçirmek için sunucunuzda PHP 8.2 veya daha güncel bir sürümün yüklü olması önerilir. Nesne yönelimli yapıda veritabanı işlemleri için PDO (PHP Data Objects) kütüphanesini kullanacağız. PDO, farklı veritabanı sistemleri arasında taşınabilirlik sağlar ve hazırlanan ifadeler (prepared statements) sayesinde güvenlik katmanı oluşturur.

  • PHP 8.2+ sürümü.
  • MySQL veya MariaDB veritabanı sunucusu.
  • Temel düzeyde sınıf (class) ve nesne (object) mantığı bilgisi.
  • Composer (isteğe bağlı, PSR-4 standartları için önerilir).

Veritabanı Yapısının Oluşturulması

Arama kayıtlarını tutmak için performanslı bir tablo yapısına ihtiyacımız var. Sadece aranan kelimeyi değil, aynı zamanda aramanın yapıldığı zamanı ve kullanıcının IP adresini de kaydetmek, analiz aşamasında size büyük kolaylık sağlayacaktır. Aşağıdaki SQL komutu ile gerekli tabloyu oluşturabilirsiniz.

CREATE TABLE search_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    search_query VARCHAR(255) NOT NULL,
    ip_address VARCHAR(45) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Bu tablo yapısında ip_address alanı, IPv6 adreslerini de desteklemesi için VARCHAR(45) olarak tanımlanmıştır. created_at alanı ise veritabanı seviyesinde otomatik zaman damgası ekleyerek uygulama yükünü azaltır.

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

Nesne yönelimli yapıda veritabanı bağlantısını tek bir noktadan yönetmek, kodun tekrar edilebilirliğini artırır. Singleton tasarım desenini veya basit bir bağımlılık enjeksiyonu yöntemini kullanabiliriz. Aşağıda, PDO kullanarak güvenli bir bağlantı sınıfı örneği yer almaktadır.

class Database {
    private $host = 'localhost';
    private $db   = 'proje_adi';
    private $user = 'root';
    private $pass = '';
    private $pdo;

    public function __construct() {
        $dsn = "mysql:host={$this->host};dbname={$this->db};charset=utf8mb4";
        $this->pdo = new PDO($dsn, $this->user, $this->pass, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]);
    }

    public function getConnection() {
        return $this->pdo;
    }
}

Bu sınıf, veritabanı bağlantı ayarlarını bir arada tutar. PDO::ATTR_ERRMODE ayarı, hata oluştuğunda PHP'nin hata fırlatmasını sağlayarak debug sürecini hızlandırır.

Arama Kayıt İşlemi İçin SearchLogger Sınıfı

Şimdi asıl işi yapacak olan SearchLogger sınıfını oluşturacağız. Bu sınıf, arama terimini alacak, temizleyecek ve veritabanına kaydedecektir. Güvenlik için XSS (Cross-Site Scripting) saldırılarını engellemek adına verileri kaydederken htmlspecialchars kullanacağız.

class SearchLogger {
    private $db;

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

    public function logSearch($query) {
        $query = trim(htmlspecialchars($query, ENT_QUOTES, 'UTF-8'));
        if (empty($query)) return;

        $stmt = $this->db->prepare("INSERT INTO search_logs (search_query, ip_address) VALUES (?, ?)");
        $stmt->execute([$query, $_SERVER['REMOTE_ADDR']]);
    }
}

Burada prepare ve execute metotlarını kullanarak SQL Injection riskini tamamen ortadan kaldırıyoruz. Kullanıcıdan gelen veri doğrudan sorguya dahil edilmez; bunun yerine yer tutucular (placeholder) kullanılır.

Dinamik Arama Kaydının Entegrasyonu

Sistemi arama sayfanızın en başına entegre etmeniz yeterlidir. Kullanıcı arama butonuna bastığında veya arama kutusuna yazı yazdığında bu metodu tetikleyerek kayıt işlemini gerçekleştirebiliriz.

// Arama sayfasında kullanım örneği
require_once 'Database.php';
require_once 'SearchLogger.php';

if (isset($_GET['q'])) {
    $db = (new Database())->getConnection();
    $logger = new SearchLogger($db);
    $logger->logSearch($_GET['q']);
    
    // Arama sonuçlarını getiren fonksiyonunuzu burada çağırın
}

Bu yapı, arama işleminin hemen öncesinde kaydın gerçekleşmesini sağlar. Eğer arama sonucunda veri bulunamazsa bile, kullanıcının ne aradığı sisteminize başarıyla işlenmiş olur.

Arama Kayıt Yöntemlerinin Karşılaştırılması

Yöntem Avantaj Dezavantaj
Veritabanı (MySQL) İlişkisel sorgulama, kolay raporlama Yüksek trafikte veritabanı yükü
Log Dosyası (TXT) Hızlı yazma, veritabanı yükü yok Analiz etmesi zor, veri güvenliği düşük
Redis (In-Memory) Çok yüksek performans Geçici veri, kurulum maliyeti
Kritik Güvenlik Uyarısı: Kullanıcıdan gelen verileri asla doğrudan veritabanı sorgularına eklemeyin. Her zaman hazırlanan ifadeleri (prepared statements) kullanın. Ayrıca, arama kayıt tablonuzun çok büyümesini engellemek için belirli aralıklarla (örneğin 3 ayda bir) eski kayıtları silen bir cron job (zamanlanmış görev) oluşturmanız önerilir.

Sıkça Sorulan Sorular

Arama kayıtları performansı düşürür mü?

Doğrudan bir INSERT işlemi performansı ciddi şekilde etkilemez. Ancak günlük milyonlarca arama yapılan bir sitede, bu kayıtları bir mesaj kuyruğu (RabbitMQ gibi) üzerinden asenkron olarak kaydetmek daha verimli olacaktır.

IP adresi kaydetmek KVKK/GDPR kapsamında sorun yaratır mı?

IP adresi kişisel veri kabul edilebilir. Kullanıcılarınızın gizlilik politikasında arama verilerinin anonim olarak analiz amaçlı tutulduğunu belirtmeniz ve gerekli yasal bildirimleri yapmanız gerekmektedir.

SQL Injection nedir ve neden bu kodda yoktur?

SQL Injection, saldırganın giriş alanlarına SQL komutları yazarak veritabanına sızmasıdır. Biz prepare kullanarak veriyi koddan ayırdığımız için veritabanı motoru gelen girdiyi komut olarak değil, sadece veri olarak algılar.

Arama terimlerini nasıl analiz edebilirim?

Veritabanındaki search_query sütununu GROUP BY ve COUNT kullanarak en çok aranan kelimeleri listeleyen bir yönetici paneli hazırlayabilirsiniz.

Hata ayıklama (debug) için ne yapmalıyım?

try-catch bloklarını Database sınıfında kullanarak oluşabilecek bağlantı hatalarını loglayabilir ve geliştirme aşamasında PDO::ERRMODE_EXCEPTION ile hataların ekrana basılmasını sağlayabilirsiniz.

Arama Verilerini Görselleştirme ve Analiz İçin İleri İpuçları

Topladığınız arama verilerini ham bir veritabanı tablosundan çıkarıp anlamlı bir stratejiye dönüştürmek, sitenizin içerik planlamasını doğrudan etkiler. Kullanıcıların arama kutusuna yazdığı terimler, aslında sitenizde bulamadıkları veya daha fazla görmek istedikleri içeriklerin bir haritasıdır.

Popüler Arama Terimlerini Raporlama

En çok aranan kelimeleri gruplandırarak bir "Trend Listesi" oluşturmak için SQL'in GROUP BY ve COUNT fonksiyonlarını kullanmalısınız. Aşağıdaki örnek, en çok aranan ilk 10 kelimeyi çekmek için kullanılacak yöntemi göstermektedir:

public function getTrendingSearches($limit = 10) {
    $sql = "SELECT search_term, COUNT(*) as count 
            FROM search_logs 
            GROUP BY search_term 
            ORDER BY count DESC 
            LIMIT :limit";
    $stmt = $this->db->prepare($sql);
    $stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

Veri Temizleme ve Normalizasyon

Kullanıcılar arama yaparken büyük/küçük harf duyarlılığı veya boşluk hataları yapabilirler. Örneğin "php eğitimi" ile "PHP Eğitimi" aynı anlama gelir ancak veritabanında farklı kayıtlar olarak görünebilir. Bunu engellemek için SearchLogger sınıfınızın içine bir normalizasyon metodu eklemelisiniz:

private function normalizeTerm($term) {
    // Küçük harfe çevir, sağdaki soldaki boşlukları sil ve HTML etiketlerini temizle
    return trim(strtolower(strip_tags($term)));
}

public function logSearch($term) {
    $cleanTerm = $this->normalizeTerm($term);
    if (strlen($cleanTerm) > 2) {
        // Kayıt işlemini burada gerçekleştirin
    }
}

Arama Kayıt Sisteminde Performans Optimizasyonu

Siteniz çok yüksek trafik alıyorsa, her arama isteğinde veritabanına yazma işlemi yapmak sunucu yükünü artırabilir. Bu durumu yönetmek için "Asenkron Kayıt" veya "Batch (Toplu) İşleme" yöntemlerini değerlendirebilirsiniz.

Redis ile Önbellekleme

Veritabanına doğrudan yazmak yerine, arama terimlerini geçici olarak Redis veya benzeri bir bellek içi veri deposunda tutabilir, ardından bir cron job (zamanlanmış görev) ile bu verileri toplu halde veritabanına aktarabilirsiniz. Bu, veritabanı üzerindeki yazma (write) yükünü ciddi oranda azaltır.

İndeksleme Stratejisi

Veritabanı tablonuz büyüdüğünde, arama kayıtlarını sorgularken yavaşlama yaşamamak için search_term ve created_at sütunlarına indeks eklemek hayati önem taşır. Aşağıdaki SQL komutu, sorgu performansınızı dramatik şekilde artıracaktır:

ALTER TABLE search_logs ADD INDEX idx_search_term (search_term);
ALTER TABLE search_logs ADD INDEX idx_created_at (created_at);

Bu indeksler, özellikle yönetici panelinde tarih aralığına göre filtreleme yaparken veya en popüler kelimeleri çekerken veritabanının tüm tabloyu taramasını engeller ve sadece ilgili indeks ağacını kullanmasını sağlar.

Sonuç

Php ile nesne yönelimli yapıda dinamik site içi arama kaydı oluşturmak, sadece bir kodlama egzersizi değil, aynı zamanda kullanıcı davranışlarını anlamak için atılan stratejik bir adımdır. Bu rehberde öğrendiğiniz PDO kullanımı, sınıf yapılandırması ve güvenlik önlemleri, web projelerinizin temelini sağlamlaştıracaktır. Bir sonraki adım olarak, kaydedilen bu verileri görselleştiren bir dashboard (yönetim paneli) hazırlayarak verileri anlamlı içgörülere dönüştürebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Dijital içerik editörlüğü geçmişimle, adım adım rehberlerin en anlaşılır ve uygulanabilir şekilde kurgulanmasını sağlıyorum. Teknik detayları herkes için sadeleştirmeyi seviyorum.

Yorumlar (0)

Yorum Yaz