Php İle Web Sitesi İçin Dinamik Bir Arama Terimi Önerisi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu uygulamayı hayata geçirmek için sunucunuzda PHP 8.2 veya daha güncel bir sürümün yüklü olması önerilir. Veritabanı yönetimi için MySQL veya MariaDB kullanacağız. Güvenlik standartlarına uygun olarak veri alışverişinde PDO (PHP Data Objects) yapısını tercih edeceğiz.

  • PHP 8.2+ sürümü.
  • MySQL 8.0+ veritabanı sunucusu.
  • PDO eklentisi aktif bir sunucu ortamı.
  • Temel düzeyde JavaScript (Fetch API kullanımı).

Veritabanı Yapısını Hazırlama

Dinamik öneriler sunabilmek için öncelikle arama yapılacak verilerin tutulduğu bir tabloya ihtiyacımız var. Performans için "indeksleme" (indexing) kritik öneme sahiptir. Aşağıdaki SQL komutu ile örnek bir tablo oluşturalım.

CREATE TABLE arama_terimleri (
    id INT AUTO_INCREMENT PRIMARY KEY,
    terim VARCHAR(255) NOT NULL,
    populerlik INT DEFAULT 0,
    INDEX(terim)
);

Burada terim sütununa INDEX eklememizin sebebi, LIKE sorgularının veritabanı üzerinde daha hızlı çalışmasını sağlamaktır. Büyük ölçekli projelerde bu yapıyı Full-Text Search (Tam Metin Arama) özellikleriyle desteklemek daha verimli sonuçlar verebilir.

Backend: PHP ile Arama Motorunu Oluşturma

Şimdi, gelen arama terimini veritabanında arayan ve sonuçları JSON formatında döndüren ara.php dosyasını oluşturalım. Burada SQL Injection saldırılarına karşı mutlaka "prepared statements" (hazırlanmış ifadeler) kullanmalıyız.

Bu kod bloğu, kullanıcıdan gelen q parametresini alır, en az 2 karakter uzunluğunda olup olmadığını kontrol eder ve veritabanında eşleşen ilk 5 sonucu JSON dizisi olarak döndürür.

Frontend: JavaScript ile Anlık Öneri Gösterimi

PHP tarafı hazır olduğuna göre, kullanıcı arama kutusuna yazı yazarken bu veriyi çekecek JavaScript kodunu yazalım. Modern tarayıcılarda fetch API kullanmak oldukça pratiktir.

const aramaInput = document.querySelector('#arama-kutusu');
const sonucAlani = document.querySelector('#sonuc-alani');

aramaInput.addEventListener('input', async (e) => {
    const query = e.target.value;
    if (query.length < 2) return;

    const response = await fetch(`ara.php?q=${encodeURIComponent(query)}`);
    const veriler = await response.json();

    sonucAlani.innerHTML = veriler.map(item => `
${item}
`).join(''); });

Bu JavaScript kodu, her tuş vuruşunda (input event) sunucuya istek atar. encodeURIComponent fonksiyonu, kullanıcı tarafından girilen özel karakterlerin URL yapısını bozmasını engeller.

Performans Optimizasyonu: Debounce Kullanımı

Her tuş vuruşunda sunucuya istek atmak, özellikle yüksek trafikli sitelerde sunucuyu yorar. Bunu engellemek için "Debounce" tekniğini kullanmalıyız. Bu teknik, kullanıcı yazmayı bıraktıktan sonra isteğin gönderilmesini sağlar.

let timer;
aramaInput.addEventListener('input', (e) => {
    clearTimeout(timer);
    timer = setTimeout(async () => {
        // Fetch işlemleri buraya gelecek
    }, 300);
});

Bu sayede sunucu üzerindeki yükü ciddi oranda azaltmış olursunuz. 300 milisaniyelik bir gecikme, kullanıcı deneyimini bozmadan sunucu trafiğini optimize eder.

Yöntem Karşılaştırması

Yöntem Avantajı Dezavantajı
SQL LIKE Basit ve hızlı kurulum Büyük veride yavaşlar
Full-Text Index Çok hızlı sonuç Veritabanı bağımlılığı
Elasticsearch Profesyonel ölçekleme Kurulum maliyeti yüksek

Güvenlik Uyarısı: Kullanıcıdan gelen verileri asla doğrudan SQL sorgularına eklemeyin. Her zaman PDO veya benzeri bir kütüphane ile parametreli sorgular (prepared statements) kullanın. Aksi takdirde SQL Injection saldırılarına karşı savunmasız kalırsınız.

Sıkça Sorulan Sorular

Arama önerileri neden gecikmeli geliyor?

Gecikme genellikle sunucu tarafındaki ağır sorgulardan veya veritabanı indeks eksikliğinden kaynaklanır. Veritabanı tablolarınızda mutlaka uygun indekslerin tanımlı olduğundan emin olun.

JSON verisi neden görüntülenmiyor?

PHP dosyanızın en üstünde header('Content-Type: application/json'); satırının olduğundan emin olun. Ayrıca PHP hatalarının JSON çıktısını bozmadığını kontrol etmek için geliştirici araçlarındaki "Network" sekmesini inceleyin.

Arama kutusuna özel karakter girilirse ne olur?

JavaScript tarafında encodeURIComponent kullanarak bu riski minimize ediyoruz. PHP tarafında ise prepared statements kullanarak veritabanı güvenliğini sağlıyoruz.

Mobil cihazlarda performans sorunu yaşar mıyım?

Mobil cihazlarda internet hızı değişkenlik gösterebilir. Debounce süresini 300ms yerine 500ms yaparak mobil kullanıcılar için daha iyi bir deneyim sunabilirsiniz.

Daha fazla öneri sunmak istersem ne yapmalıyım?

PHP tarafındaki LIMIT 5 değerini artırabilir veya veritabanı sorgusuna ORDER BY populerlik DESC ekleyerek en çok aranan terimlerin ilk sırada çıkmasını sağlayabilirsiniz.

Gelişmiş Arama Deneyimi İçin Redis Entegrasyonu

Veritabanı sorgularınız büyüdükçe, her karakter girişinde doğrudan SQL sorgusu çalıştırmak sunucu yükünü artırabilir. Bu noktada, sık aranan terimleri bellekte tutan Redis kullanımı, arama önerilerinizi milisaniyeler seviyesine çeker. Redis, anahtar-değer yapısı sayesinde disk tabanlı veritabanı sorgularına olan ihtiyacı minimize eder.

Aşağıdaki örnekte, bir arama terimi için Redis üzerinde önbellek kontrolü yapan ve veri yoksa veritabanına başvuran bir yapı görebilirsiniz:

Arama Sonuçlarında Hata Ayıklama ve Loglama

Dinamik arama sistemlerinde en sık karşılaşılan sorunlar, kullanıcıların beklediği sonuçları alamaması veya sunucunun 500 hatası döndürmesidir. Bu tür durumları tespit etmek için geliştirme aşamasında bir loglama mekanizması kurmak hayati önem taşır.

Kritik Hata İzleme Stratejileri

  • HTTP Durum Kodları: PHP tarafında veritabanı bağlantısı koptuğunda veya sorgu başarısız olduğunda http_response_code(500) döndürerek JavaScript tarafında catch bloğunun tetiklenmesini sağlayın.
  • Sorgu Süresi Ölçümü: Arama sorgularının ne kadar sürdüğünü loglayarak, yavaşlayan SQL ifadelerini tespit edebilirsiniz.

Aşağıdaki kod parçası, arama sorgusunun süresini ölçmek ve hataları kaydetmek için kullanılabilir:

Profesyonel İpucu: Kullanıcıların arama kutusuna yazdığı ancak hiçbir sonuç döndürmeyen terimleri ayrı bir tabloda tutun. Bu "sıfır sonuç" verisi, sitenizin içerik stratejisini belirlemek için en değerli kaynaktır.

Sonuç

PHP ile web sitesi için dinamik bir arama terimi önerisi yapmak, doğru araçlar ve güvenlik önlemleriyle oldukça verimli bir süreçtir. Bu rehberde, veritabanı hazırlığından frontend optimizasyonuna kadar uçtan uca bir sistem kurduk. Bir sonraki adım olarak, arama geçmişini analiz eden ve kullanıcıya kişiselleştirilmiş öneriler sunan bir "Redis" tabanlı önbellekleme mekanizması üzerinde çalışabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Burak Çelik

Doğa sporları, kampçılık ve açık hava aktiviteleri konularında uzmanlaşmış bir rehber yazarıyım. Yeni başlayanlar için güvenli ve keyifli bir deneyim sunacak, teknik bilgisi yüksek içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz