Gereksinimler ve Ön Hazırlık
Sistemin sağlıklı çalışması için sunucunuzda PHP 8.2 veya üzeri bir sürümün kurulu olması önerilir. Veritabanı yönetimi için PDO (PHP Data Objects) kütüphanesini kullanacağız; bu sayede veritabanı bağımsız ve güvenli sorgular oluşturabiliriz. Ayrıca, verilerin tutulacağı bir MySQL veya MariaDB veritabanı ortamına ihtiyacınız olacaktır.
- PHP 8.2+: Modern sözdizimi ve performans iyileştirmeleri için.
- PDO Sürücüsü: Güvenli veritabanı işlemleri için.
- Composer: Gerekli olması durumunda yardımcı kütüphaneleri yönetmek için.
- Temel OOP Bilgisi: Sınıflar, metotlar ve kalıtım mantığına aşinalık.
Arama Geçmişi Veri Modelini Oluşturma
Nesne yönelimli yapıda ilk adım, veriyi temsil edecek bir "Model" sınıfı oluşturmaktır. Bu sınıf, veritabanındaki arama kayıtlarını birer nesneye dönüştürerek işlem yapmamızı kolaylaştırır. Aşağıda, arama geçmişi verisini tutacak temel sınıf yapısını görebilirsiniz.
class SearchEntry {
public function __construct(
public int $id,
public int $userId,
public string $query,
public DateTime $createdAt
) {}
}
Bu sınıf, veritabanından gelen her bir satırı temsil eder. public özellikler (property promotion) kullanarak kodun daha kısa ve okunabilir olmasını sağladık. Bu yapı, veriler üzerinde işlem yaparken tip güvenliğini (type-safety) garanti eder.
Veritabanı Bağlantısı ve Güvenli Veri Kaydı
Kullanıcıların yaptığı aramaları veritabanına kaydederken SQL Injection saldırılarına karşı hazırlıklı olmalıyız. PDO kullanarak hazırlanan ifadeler (prepared statements), kullanıcı girdilerini doğrudan sorguya dahil etmeden güvenli bir şekilde işler.
class SearchRepository {
private PDO $db;
public function __construct(PDO $db) {
$this->db = $db;
}
public function saveSearch(int $userId, string $query): bool {
$stmt = $this->db->prepare("INSERT INTO search_history (user_id, query, created_at) VALUES (?, ?, NOW())");
return $stmt->execute([$userId, $query]);
}
}
Burada saveSearch metodu, dışarıdan gelen veriyi doğrudan sorguya gömmek yerine ? yer tutucularını kullanır. Bu, uygulamanızın güvenliği için atılması gereken en temel adımdır.
Kritik Güvenlik Uyarısı: Kullanıcıdan gelen arama sorgularını veritabanına kaydetmeden önce mutlakahtmlspecialchars()veya benzeri fonksiyonlarla XSS (Cross-Site Scripting) saldırılarına karşı filtreleyin. Ayrıca, veritabanı bağlantı bilgilerinizi asla kod içerisinde açık metin olarak tutmayın;.envdosyaları veya güvenli konfigürasyon dosyaları kullanın.
Dinamik Analiz Motoru Geliştirme
Verileri kaydettikten sonra, bu verileri analiz etmemiz gerekir. Örneğin, en çok aranan kelimeleri bulmak veya belirli bir kullanıcının arama trendlerini çıkarmak için bir analiz sınıfı oluşturabiliriz. Bu sınıf, verileri işlemek için gerekli mantığı barındırır.
class SearchAnalyzer {
private PDO $db;
public function __construct(PDO $db) {
$this->db = $db;
}
public function getMostPopularSearches(int $limit = 10): array {
$sql = "SELECT query, COUNT(*) as count FROM search_history GROUP BY query ORDER BY count DESC LIMIT $limit";
return $this->db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
}
Yukarıdaki kod, veritabanından en çok aranan terimleri gruplayarak çeker. Bu analiz, sitenizde "Popüler Aramalar" bölümü oluşturmak için idealdir.
Veri Analizi Yöntemlerinin Karşılaştırılması
Arama geçmişini analiz ederken kullanabileceğiniz farklı yaklaşımlar mevcuttur. Aşağıdaki tablo, bu yöntemlerin avantaj ve dezavantajlarını özetlemektedir.
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Veritabanı Sorgusu (SQL) | Hızlı ve doğrudan sonuç verir. | Büyük verilerde sunucuyu yorar. |
| PHP Koleksiyonları | Esnek veri işleme sağlar. | Bellek (RAM) tüketimi yüksektir. |
| Redis/Önbellek | Çok yüksek performans. | Karmaşık yapılandırma gerektirir. |
Nesne Yönelimli Yapıda Raporlama
Analiz edilen verileri bir arayüzde veya API yanıtında sunmak için bir raporlama sınıfı kullanmak, kodun modülerliğini artırır. Bu sınıf, analiz sonuçlarını alır ve istenen formata dönüştürür.
class SearchReporter {
public function formatAsJson(array $data): string {
return json_encode(['status' => 'success', 'data' => $data]);
}
}
Bu yapı, analiz motorundan gelen ham diziyi (array) JSON formatına çevirerek frontend tarafına gönderilmeye hazır hale getirir.
Sıkça Sorulan Sorular
Arama geçmişi verilerini ne kadar süreyle saklamalıyım?
Kullanıcı gizliliği ve veritabanı performansı açısından, arama geçmişi verilerini 3 veya 6 aylık periyotlarla temizlemeniz (arşivlemeniz) önerilir. KVKK ve GDPR uyumluluğu için kullanıcıya verilerini silme hakkı tanıyan bir mekanizma kurmalısınız.
SQL Injection'ı önlemek için PDO dışında ne yapabilirim?
PDO, SQL Injection'a karşı en güçlü savunmadır. Ancak, veritabanı sorgularınızda dinamik tablo isimleri kullanmanız gerekiyorsa, bu isimleri bir "beyaz liste" (whitelist) içerisinden seçtiğinizden emin olmalısınız.
Büyük ölçekli uygulamalarda bu sistem yavaşlamaz mı?
Evet, binlerce kullanıcı aynı anda arama yaptığında veritabanı yükü artabilir. Bu durumda, arama sonuçlarını Redis gibi bir bellek içi veri deposunda önbelleğe almak veya analiz işlemlerini bir "cron job" (zamanlanmış görev) ile arka planda çalıştırmak en iyi pratiktir.
Arama geçmişi analizi SEO'ya nasıl katkı sağlar?
Kullanıcıların sitenizde ne aradığını bilmek, içerik stratejinizi geliştirmenize olanak tanır. Kullanıcıların bulamadığı veya sıkça aradığı konuları tespit ederek yeni makaleler veya ürün sayfaları oluşturabilirsiniz.
Bu yapıya "Arama Önerileri" özelliği nasıl eklenir?
Arama önerileri için LIKE operatörü ile veritabanında "autocomplete" sorgusu yapabilirsiniz. Ancak, daha iyi bir deneyim için veritabanında "FULLTEXT INDEX" kullanmanız veya ElasticSearch gibi daha gelişmiş arama motorlarına geçmeniz önerilir.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce, tüm veritabanı işlemlerini, hata yönetimi (try-catch blokları) ve loglama sistemleri ile desteklediğinizden emin olun. Kod güvenliği tamamen geliştiricinin sorumluluğundadır.
Performans Optimizasyonu ve Veri İndeksleme Stratejileri
Arama geçmişi verileri, uygulamanız büyüdükçe veritabanı üzerinde ciddi bir yük oluşturabilir. Özellikle arama_terimleri tablosundaki kayıt sayısı milyonlara ulaştığında, basit SELECT sorguları performans darboğazlarına yol açar. Bu noktada veritabanı indeksleme ve sorgu optimizasyonu kritik öneme sahiptir.
Veritabanı seviyesinde, en sık sorgulanan sütunlara (örneğin terim ve tarih) indeks eklemek, analiz motorunuzun çalışma süresini milisaniyelere indirecektir. Aşağıdaki SQL komutu, arama performansını artırmak için temel bir indeksleme örneğidir:
CREATE INDEX idx_arama_terim_tarih ON arama_gecmisi (terim, olusturulma_tarihi);
Ayrıca, analiz motorunuzda COUNT(*) veya GROUP BY işlemleri yaparken tüm tabloyu taramak yerine, belirli bir zaman aralığına odaklanan "partitioning" (bölümleme) stratejilerini kullanabilirsiniz. Eğer veriniz çok büyükse, verileri aylık tablolara bölmek (örneğin arama_gecmisi_2023_10) sorgu hızını ciddi oranda artıracaktır.
Analiz Motoru İçin Birim Testleri (Unit Testing)
Nesne yönelimli yapıda geliştirdiğiniz analiz motorunun doğruluğunu garanti altına almak için PHPUnit gibi araçlarla test yazmak, kodunuzun güvenilirliğini artırır. Bir analiz metodunun beklenen sonucu döndürüp döndürmediğini kontrol eden örnek bir test sınıfı yapısı şöyledir:
use PHPUnit\Framework\TestCase;
class AnalizMotoruTest extends TestCase {
public function testEnCokArananKelimeyiGetir() {
$db = $this->createMock(PDO::class);
$analiz = new AramaAnalizMotoru($db);
// Simüle edilen veri seti
$sonuc = $analiz->enCokArananlariGetir(5);
$this->assertIsArray($sonuc);
$this->assertLessThanOrEqual(5, count($sonuc));
}
}
Test süreçlerinde dikkat etmeniz gereken temel noktalar şunlardır:
- Mocking: Veritabanı bağlantısını doğrudan kullanmak yerine Mock nesneleri kullanarak veritabanından bağımsız testler yapın.
- Sınır Değerleri: Boş arama geçmişi, hatalı karakter girişi veya çok uzun arama sorguları gibi uç durumları mutlaka test edin.
- Veri Bütünlüğü: Analiz sonuçlarının doğru hesaplandığından emin olmak için bilinen bir veri seti ile manuel sonuçları karşılaştırın.
İleri Düzey İpuçları: Veri Temizleme ve Anonimleştirme
Kullanıcı verilerini analiz ederken KVKK ve GDPR uyumluluğu göz ardı edilmemelidir. Arama geçmişi verilerini saklarken kişisel verileri (IP adresi, kullanıcı adı vb.) anonimleştirmek için bir "Data Sanitization" katmanı eklemeniz önerilir.
Aşağıdaki örnek, analiz motoruna giren verileri temizleyen basit bir yardımcı metot yapısını göstermektedir:
class VeriTemizleyici {
public static function sanitize(string $input): string {
// HTML etiketlerini temizle ve özel karakterleri encode et
$temiz = strip_tags($input);
return htmlspecialchars($temiz, ENT_QUOTES, 'UTF-8');
}
}
// Kullanımı:
$temizTerim = VeriTemizleyici::sanitize($_POST['arama']);
Bu yaklaşım, hem güvenlik açıklarını minimize eder hem de analiz sonuçlarınızın "çöp verilerden" (spam veya hatalı girişler) arınmış, daha kaliteli bir veri seti olmasını sağlar.
Sonuç
PHP ile nesne yönelimli yapıda dinamik arama geçmişi analizi yapmak, sadece veri kaydetmekten ibaret değildir; bu veriyi anlamlı bir iş zekasına dönüştürme sürecidir. Sınıf tabanlı yaklaşım, uygulamanızın sürdürülebilirliğini artırır ve gelecekteki geliştirmeler için sağlam bir temel oluşturur. Bir sonraki adım olarak, bu analiz sonuçlarını bir grafik kütüphanesi (örneğin Chart.js) ile görselleştiren bir yönetici paneli geliştirmeyi deneyebilirsiniz. Başarılı kodlamalar dilerim.

Yorumlar (0)
Yorum Yaz