Gereksinimler ve Ön Hazırlık
Bu projeyi hayata geçirmek için sisteminizde PHP 8.2 veya üzeri bir sürümün yüklü olması önerilir. Veri depolama için MySQL veya MariaDB kullanacağız. Veri tabanı işlemleri için PDO (PHP Data Objects) kütüphanesini tercih edeceğiz; çünkü PDO, SQL Injection saldırılarına karşı hazırlıklı olmamızı sağlar.
- PHP 8.2+ sürümü.
- MySQL 8.0+ veritabanı sunucusu.
- PDO eklentisi aktif bir web sunucusu (Apache veya Nginx).
- Temel düzeyde SQL ve PHP sözdizimi bilgisi.
Adım 1: Arama Geçmişi İçin Veritabanı Tasarımı
Arama verilerini saklamak için verimli bir tablo yapısı kurmalıyız. Sadece aranan kelimeyi değil, aramanın yapıldığı zamanı ve kullanıcıyı tanımlayan bir ID'yi de kaydetmek analiz kalitesini artırır. Aşağıdaki SQL komutu ile gerekli tabloyu oluşturabilirsiniz.
CREATE TABLE arama_gecmisi (
id INT AUTO_INCREMENT PRIMARY KEY,
arama_terimi VARCHAR(255) NOT NULL,
ip_adresi VARCHAR(45),
tarih TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Bu tablo yapısında arama_terimi sütunu, kullanıcının girdiği veriyi tutar. ip_adresi ise anonim olarak hangi bölgeden veya kullanıcıdan geldiğini anlamamıza yardımcı olur. utf8mb4 karakter seti, Türkçe karakterlerin doğru kaydedilmesi için kritiktir.
Adım 2: Arama Terimlerini Veritabanına Kaydetme
Kullanıcı arama formuna bir veri girdiğinde, bu veriyi doğrudan veritabanına göndermeden önce temizlemeliyiz. XSS (Cross-Site Scripting) saldırılarını engellemek için htmlspecialchars() fonksiyonunu kullanmak iyi bir pratiktir.
// Arama verisini veritabanına kaydeden fonksiyon
function aramaKaydet($pdo, $terim) {
$terim = trim(htmlspecialchars($terim, ENT_QUOTES, 'UTF-8'));
if (strlen($terim) > 2) {
$sql = "INSERT INTO arama_gecmisi (arama_terimi, ip_adresi) VALUES (:terim, :ip)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
'terim' => $terim,
'ip' => $_SERVER['REMOTE_ADDR']
]);
}
}
Bu kod bloğu, gelen veriyi temizler ve PDO kullanarak SQL Injection riskini ortadan kaldırır. strlen kontrolü ile çok kısa veya boş karakterlerin veritabanını kirletmesini engelliyoruz.
Adım 3: Dinamik Analiz İçin Verileri Sorgulama
Verileri kaydettikten sonra, en çok aranan terimleri analiz etmek için SQL'in GROUP BY ve COUNT fonksiyonlarını kullanırız. Bu, hangi konuların popüler olduğunu anlamamızı sağlar.
// En çok aranan terimleri getiren sorgu
$sql = "SELECT arama_terimi, COUNT(*) as toplam
FROM arama_gecmisi
GROUP BY arama_terimi
ORDER BY toplam DESC
LIMIT 10";
$stmt = $pdo->query($sql);
$populerAramalar = $stmt->fetchAll(PDO::FETCH_ASSOC);
Bu sorgu, veritabanındaki tüm aramaları gruplandırarak en popüler 10 terimi listeler. Bu verileri daha sonra bir dashboard ekranında kullanıcılarınıza veya kendinize sunabilirsiniz.
Adım 4: Veri Analizi Yöntemlerinin Karşılaştırılması
Arama geçmişi analizi yaparken farklı yaklaşımlar kullanabilirsiniz. Aşağıdaki tablo, farklı ölçeklerdeki projeler için uygun yöntemleri özetlemektedir.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| SQL Veritabanı | Basit kurulum, kolay sorgulama | Yüksek trafikte performans kaybı |
| Redis (Önbellek) | Çok hızlı okuma/yazma | Veri kalıcılığı yönetimi zordur |
| Log Dosyaları | Sistem yükü minimumdur | Analiz etmek için ek araç gerekir |
Adım 5: Güvenlik ve Performans Optimizasyonu
Veritabanı işlemleri sırasında güvenlik en önemli konudur. Kullanıcıdan gelen veriye asla güvenmemeli ve her zaman filtrelemelisiniz. Ayrıca, çok fazla arama kaydı biriktiğinde veritabanınız yavaşlayabilir; bu yüzden eski kayıtları periyodik olarak temizlemek veya arşivlemek önemlidir.
Kritik Uyarı: Kullanıcı verilerini işlerken KVKK (Kişisel Verilerin Korunması Kanunu) kurallarına uyunuz. IP adresleri kişisel veri sayılabilir; bu nedenle kullanıcıları anonimleştirmeniz veya açık rıza almanız gerekebilir.
// 30 günden eski verileri temizleme (Bakım scripti)
$tarih = date('Y-m-d H:i:s', strtotime('-30 days'));
$sql = "DELETE FROM arama_gecmisi WHERE tarih < :tarih";
$stmt = $pdo->prepare($sql);
$stmt->execute(['tarih' => $tarih]);
Bu kod parçası, veritabanınızın şişmesini engeller ve performansın sürdürülebilir kalmasını sağlar. Bakım scriptlerini bir "cron job" (zamanlanmış görev) olarak sunucunuzda çalıştırmanız önerilir.
Sıkça Sorulan Sorular
Arama geçmişi verilerini saklamak siteyi yavaşlatır mı?
Doğrudan her aramada veritabanına yazmak yerine, verileri bir kuyruk sistemine veya Redis gibi bellek içi bir veritabanına alıp belirli aralıklarla ana veritabanına aktarırsanız performans kaybı yaşamazsınız.
Arama analizi için hangi kütüphaneleri kullanmalıyım?
Küçük ölçekli projeler için PHP'nin yerleşik PDO kütüphanesi yeterlidir. Büyük projelerde ise Elasticsearch veya Meilisearch gibi arama motoru çözümlerine geçiş yapmanız daha profesyonel sonuçlar verir.
SQL Injection'dan nasıl %100 korunurum?
Her zaman hazırlıklı ifadeler (prepared statements) kullanın. Asla kullanıcıdan gelen veriyi doğrudan SQL sorgusunun içine string olarak birleştirmeyin.
Kullanıcıların arama geçmişini onlara nasıl gösterebilirim?
Kullanıcı giriş yaptıysa, veritabanında kullanici_id sütunu tutarak SELECT * FROM arama_gecmisi WHERE kullanici_id = ? sorgusu ile kişisel geçmişlerini listeleyebilirsiniz.
Veri analizi için görselleştirme aracı gerekli mi?
Evet, verileri ham tablo yerine Chart.js gibi kütüphanelerle grafiklere dökerseniz, hangi terimlerin hangi zaman diliminde arttığını çok daha hızlı analiz edebilirsiniz.
Sorumluluk Reddi: Bu rehberdeki kodlar eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce gerekli tüm güvenlik testlerini yapmalı ve veritabanı yedeklerinizi almalısınız. Yazılım güvenliği sorumluluğu geliştiriciye aittir.
Arama Analizi İçin İleri Seviye İpuçları ve Stratejiler
Elde ettiğiniz arama verilerini sadece bir liste olarak tutmak yerine, bu verilerden anlamlı iş zekası (Business Intelligence) çıkarabilirsiniz. Kullanıcıların arama niyetini (search intent) anlamak, içerik stratejinizi belirlemenize yardımcı olur. Örneğin, kullanıcılar sitenizde bulunmayan bir terimi sıkça aratıyorsa, bu durum yeni bir içerik veya ürün kategorisi oluşturmanız gerektiğinin bir sinyalidir.
Veri setiniz büyüdükçe, sorgu performansını korumak için şu stratejileri uygulayabilirsiniz:
- Veri Bölümleme (Partitioning): Arama geçmişi tablosunu tarih bazlı (aylık veya yıllık) bölümlere ayırarak, eski verilerin sorgu hızını etkilemesini engelleyin.
- Caching (Önbellekleme): En çok aranan ilk 10 terimi Redis veya Memcached gibi bir katmanda tutarak, veritabanı üzerindeki yükü %90 oranında azaltabilirsiniz.
- Full-Text Search (Tam Metin Arama): MySQL'in
LIKEoperatörü yerineMATCH() AGAINST()fonksiyonunu kullanarak arama hızını ve alaka düzeyini artırın.
Hata Ayıklama ve Log Yönetimi
Arama motorunuzun düzgün çalışıp çalışmadığını anlamak için mutlaka hata loglarını takip etmelisiniz. Özellikle kullanıcıların girdiği özel karakterler veya veritabanı bağlantı hataları, analiz sürecini kesintiye uğratabilir. Aşağıdaki örnek, arama kaydı sırasında oluşabilecek hataları yakalayıp bir log dosyasına yazan güvenli bir yapı sunar:
try {
$pdo = new PDO('mysql:host=localhost;dbname=analiz_db', 'kullanici', 'sifre');
$stmt = $pdo->prepare("INSERT INTO arama_gecmisi (terim, ip_adresi) VALUES (?, ?)");
$stmt->execute([$arananTerim, $_SERVER['REMOTE_ADDR']]);
} catch (PDOException $e) {
// Hata detayını gizli bir log dosyasına yazın
error_log("Arama kaydı hatası: " . $e->getMessage(), 3, '/var/log/php_arama_hata.log');
// Kullanıcıya genel bir mesaj gösterin
echo "Sistem geçici olarak meşgul.";
}
Bu yaklaşım, hem uygulamanızın kararlılığını artırır hem de geliştirici olarak hangi terimlerin sistemde hata tetiklediğini (örneğin SQL injection denemeleri) görmenizi sağlar. Hata loglarını düzenli olarak incelemek, sitenizin güvenlik açıklarını erkenden tespit etmenize de olanak tanır.
Ölçeklenebilir Veri Analizi İçin Alternatif Yaklaşımlar
Siteniz binlerce veya milyonlarca arama hacmine ulaştığında, standart SQL sorguları yetersiz kalabilir. Bu aşamada, verileri Elasticsearch veya Apache Solr gibi arama motoru odaklı araçlara aktarmak profesyonel bir çözümdür. Ancak başlangıç aşamasında, PHP ile verileri CSV formatında dışa aktarıp Excel veya Google Sheets üzerinden analiz etmek de oldukça etkili bir yöntemdir.
| Yöntem | Avantajı | Zorluk Derecesi |
|---|---|---|
| SQL Sorguları | Hızlı ve kolay kurulum | Düşük |
| Redis / Önbellek | Anlık performans artışı | Orta |
| Elasticsearch | Büyük veri analizi | Yüksek |
Bu yöntemleri projenizin ölçeğine göre seçerek, arama geçmişi analizini sürdürülebilir bir yapıya dönüştürebilirsiniz.
Sonuç
Php ile web sitesi için dinamik bir arama geçmişi analizi yapmak, 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 veri girişi ve analiz yöntemleri, profesyonel projelerinizin temelini oluşturacaktır. Bir sonraki adım olarak, elde ettiğiniz bu verileri görselleştiren bir yönetim paneli (dashboard) oluşturmayı deneyebilirsiniz. Başarılı kodlamalar dilerim.


Yorumlar (0)
Yorum Yaz