Php İle Web Sitesi İçin Dinamik Bir Site İçi Arama İstatistik Modülü Nasıl Yapılır?

Php İle Web Sitesi İçin Dinamik Bir Site İçi Arama İstatistik Modülü Nasıl Yapılır?
Php İle Web Sitesi İçin Dinamik Bir Site İçi Arama İstatistik Modülü Nasıl Yapılır?

PHP ile Web Sitesi İçin Dinamik Bir Site İçi Arama İstatistik Modülü Nasıl Yapılır?

Web sitenizin kullanıcı deneyimini iyileştirmenin en etkili yollarından biri, ziyaretçilerinizin ne aradığını anlamaktır. PHP ile web sitesi için dinamik bir site içi arama istatistik modülü oluşturarak, kullanıcıların hangi terimleri arattığını, hangi sonuçlara tıkladığını ve hangi aramalarda sonuç bulamadığını kayıt altına alabilirsiniz. Bu veriler, içerik stratejinizi belirlemek ve sitenizin navigasyon yapısını optimize etmek için kritik öneme sahiptir.

Bu rehberde, modern PHP standartlarını kullanarak, veritabanı bağlantısından veri görselleştirmeye kadar uçtan uca bir arama takip sistemi kurmayı öğreneceksiniz. Güvenlik standartlarına uygun, SQL injection saldırılarına karşı korumalı ve ölçeklenebilir bir yapı inşa edeceğiz.

Gereksinimler ve Ön Hazırlık

Bu projeyi hayata geçirmek için sunucunuzda PHP 8.2 veya üzeri bir sürümün yüklü olması önerilir. Veri depolama için MySQL veya MariaDB kullanacağız. Ayrıca, veritabanı işlemlerini güvenli hale getirmek için PDO (PHP Data Objects) kütüphanesini kullanacağız.

  • PHP 8.2+ (Tip güvenliği ve performans için)
  • MySQL 8.0+ veya MariaDB 10.6+
  • Temel düzeyde SQL ve PHP bilgisi
  • PDO ile veritabanı bağlantısı kurma yetkinliği

Veritabanı Yapısının Kurulması

Arama istatistiklerini tutmak için iki ana tabloya ihtiyacımız var: arama_loglari (yapılan aramalar) ve arama_populerlik (özet veriler). Veritabanı tasarımında indeksleme, büyük veri setlerinde sorgu hızını artırmak için kritiktir.

CREATE TABLE arama_loglari (
    id INT AUTO_INCREMENT PRIMARY KEY,
    arama_terimi VARCHAR(255) NOT NULL,
    ip_adresi VARCHAR(45),
    tarih TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    sonuc_sayisi INT DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Yukarıdaki kod, her bir arama isteğini loglamak için gerekli tabloyu oluşturur. ip_adresi sütunu, kullanıcı bazlı analiz yapabilmeniz için eklenmiştir.

PHP ile Güvenli Arama Kaydı Oluşturma

Kullanıcı arama kutusuna bir terim girdiğinde, bu veriyi veritabanına işlemek için PDO kullanmalıyız. Doğrudan kullanıcı girdisini SQL sorgusuna eklemek, büyük bir güvenlik açığı olan SQL Injection'a davetiye çıkarır. Prepared Statements (Hazırlanmış İfadeler) kullanarak bu riski ortadan kaldırıyoruz.

// db_baglanti.php
$pdo = new PDO('mysql:host=localhost;dbname=site_db;charset=utf8mb4', 'kullanici', 'sifre');

// arama_kaydet.php
function aramaKaydet($terim, $sonucSayisi) {
    global $pdo;
    $stmt = $pdo->prepare("INSERT INTO arama_loglari (arama_terimi, ip_adresi, sonuc_sayisi) VALUES (?, ?, ?)");
    $stmt->execute([$terim, $_SERVER['REMOTE_ADDR'], $sonucSayisi]);
}

Bu kod bloğu, arama terimini ve dönen sonuç sayısını veritabanına güvenli bir şekilde kaydeder. $_SERVER['REMOTE_ADDR'] kullanarak kullanıcının IP adresini alıyoruz, ancak GDPR veya KVKK gereği bu verileri anonimleştirmeniz gerekebileceğini unutmayın.

İstatistiklerin Analiz Edilmesi ve Raporlanması

Toplanan verileri anlamlı kılmak için en çok aranan terimleri listelememiz gerekir. SQL'in GROUP BY ve COUNT fonksiyonları, bu tür özet raporlar için biçilmiş kaftandır.

// istatistik_getir.php
$sql = "SELECT arama_terimi, COUNT(*) as toplam_arama 
        FROM arama_loglari 
        GROUP BY arama_terimi 
        ORDER BY toplam_arama DESC 
        LIMIT 10";

$stmt = $pdo->query($sql);
$populerAramalar = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($populerAramalar as $row) {
    echo $row['arama_terimi'] . ": " . $row['toplam_arama'] . " kez arandı
"; }

Bu örnek, sitenizde en çok aranan 10 kelimeyi ekrana yazdırır. Bu veriyi bir yönetici panelinde grafiklerle görselleştirerek daha profesyonel bir görünüm elde edebilirsiniz.

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

Yöntem Avantajı Dezavantajı
SQL Loglama Basit, kurulumu kolay, hızlı. Büyük veride performans düşebilir.
Redis/In-Memory Çok hızlı, anlık veri analizi. Karmaşık yapı, ek sunucu gereksinimi.
Google Analytics Detaylı raporlama, hazır araçlar. Veri gizliliği, tam kontrolün olmaması.

Güvenlik ve Performans Uyarıları

Kritik Uyarı: Kullanıcıdan gelen verileri asla doğrudan veritabanına göndermeyin. Her zaman htmlspecialchars() ile XSS (Cross-Site Scripting) saldırılarına karşı temizleme yapın. Ayrıca, veritabanı tablolarınızın çok büyümesini engellemek için belirli aralıklarla eski logları temizleyen (archiving) bir cron job kurun.

Performans için arama_terimi sütununa mutlaka bir index ekleyin: CREATE INDEX idx_terim ON arama_loglari(arama_terimi);. Bu, milyonlarca kayıt olsa bile sorgularınızın milisaniyeler içinde çalışmasını sağlar.

Sıkça Sorulan Sorular

Arama istatistiklerini tutmak siteyi yavaşlatır mı?

Doğru indeksleme ve basit bir INSERT sorgusu ile sitenizin hızında hissedilir bir fark oluşmaz. Ancak, çok yüksek trafikli sitelerde veritabanına yazma işlemini asenkron (kuyruk sistemi ile) yapmanız önerilir.

Kullanıcıların IP adreslerini saklamak yasal mı?

Kişisel verilerin korunması kanunları gereği, IP adresleri kişisel veri olarak kabul edilebilir. Kullanıcılarınızdan gerekli izinleri almalı veya IP adreslerini hashleyerek (anonimleştirerek) saklamalısınız.

Sonuç bulunamayan aramaları nasıl takip ederim?

aramaKaydet fonksiyonunuza $sonucSayisi == 0 kontrolü ekleyerek, "sonuçsuz aramalar" için ayrı bir tablo veya bir flag (bayrak) kullanabilirsiniz.

PHP 8.2 ile gelen yenilikleri kullanmalı mıyım?

Evet, PHP 8.2'nin sunduğu readonly sınıflar ve geliştirilmiş tip sistemi, veritabanı işlemlerini yöneten sınıflarınızda daha hatasız kod yazmanızı sağlar.

Bu verileri CSV olarak dışa aktarabilir miyim?

Evet, PHP'nin fputcsv() fonksiyonu ile veritabanından çektiğiniz verileri kolayca Excel veya benzeri programlarla uyumlu dosyalara dönüştürebilirsiniz.

İstatistik Verilerini Görselleştirmek İçin Chart.js Entegrasyonu

Topladığınız arama verilerini ham bir tablo olarak görmek yerine, kullanıcıların hangi terimleri ne sıklıkla aradığını grafiksel olarak izlemek, içerik stratejinizi belirlemenizde büyük rol oynar. Chart.js, hafif yapısı ve kolay kullanımıyla bu iş için idealdir.

Öncelikle PHP tarafında verileri JSON formatında hazırlayan bir uç nokta (endpoint) oluşturmalıyız:


// search_data.php
header('Content-Type: application/json');
$pdo = new PDO('mysql:host=localhost;dbname=site_db', 'user', 'pass');
$stmt = $pdo->query("SELECT aranan_kelime, COUNT(*) as sayi FROM arama_istatistikleri GROUP BY aranan_kelime ORDER BY sayi DESC LIMIT 10");
echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC));

Ardından, ön yüzde bu veriyi çekerek bir çubuk grafik oluşturabilirsiniz:





fetch('search_data.php')
    .then(response => response.json())
    .then(data => {
        const labels = data.map(item => item.aranan_kelime);
        const values = data.map(item => item.sayi);
        new Chart(document.getElementById('myChart'), {
            type: 'bar',
            data: { labels: labels, datasets: [{ label: 'Arama Sayısı', data: values }] }
        });
    });

Arama Modülünde Performans Optimizasyonu ve İndeksleme

Siteniz büyüdükçe, arama_istatistikleri tablosundaki kayıt sayısı on binleri aşabilir. Bu durum, raporlama sorgularının yavaşlamasına neden olur. Veritabanı performansını korumak için şu stratejileri uygulamanız kritiktir:

  • İndeksleme (Indexing): aranan_kelime ve tarih sütunlarına mutlaka indeks ekleyin. Bu, gruplama ve sıralama işlemlerini ciddi oranda hızlandırır.
  • Veri Arşivleme: 6 aydan eski verileri ana tablodan alıp bir arama_arsiv tablosuna taşıyın.
  • Sorgu Önbellekleme: Dashboard verilerini her sayfa yenilemesinde değil, örneğin her 1 saatte bir güncellenen bir JSON dosyasından okuyun.

İndeksleme için SQL komutunuz şu şekilde olmalıdır:


ALTER TABLE arama_istatistikleri ADD INDEX idx_kelime (aranan_kelime);
ALTER TABLE arama_istatistikleri ADD INDEX idx_tarih (tarih);

Bu optimizasyonlar, veritabanı üzerindeki yükü azaltırken, aynı zamanda arama modülünüzün sunucu kaynaklarını daha verimli kullanmasını sağlar. Özellikle yüksek trafikli sitelerde, COUNT sorgularını doğrudan ana tablo üzerinde çalıştırmak yerine, periyodik olarak çalışan bir Cron Job ile özet tablolar oluşturmak en profesyonel yaklaşımdır.

Sonuç

PHP ile dinamik bir site içi arama istatistik modülü oluşturmak, hem teknik becerilerinizi geliştirir hem de sitenizin kullanıcı odaklı bir yapıya kavuşmasını sağlar. Bu rehberde öğrendiğiniz veritabanı tasarımı, güvenli sorgulama ve veri analizi yöntemleri, profesyonel web projelerinizin temel taşlarını oluşturacaktır.

Bir sonraki adım olarak, bu istatistikleri bir dashboard üzerinde Chart.js gibi bir kütüphane kullanarak görselleştirmeyi deneyebilirsiniz. Unutmayın, veriye dayalı kararlar her zaman sezgisel kararlardan daha başarılı sonuçlar verir.

Yasal Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce güvenlik açıklarını (SQL Injection, XSS, CSRF) tekrar gözden geçirmeniz ve gerekli tüm güvenlik katmanlarını uygulamanız tavsiye edilir.

Bu yazıya tepkinizi paylaşın:
Zeynep Sönmez

Dijital içerik üretimi ve teknik rehber hazırlama süreçlerinde uzmanlaşmış bir editörüm. Okuyucuların hayatını kolaylaştıran, adım adım uygulanabilir kılavuzlar yazmayı hedefliyorum.

Yorumlar (0)

Yorum Yaz