irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 290
- Tepkime puanı
- 2
- Puanları
- 18
Klasik arama sistemlerinde kullanıcı kelimeyi yazar, butona tıklar ve sayfanın yenilenmesini bekler. Canlı arama sisteminde ise sayfa yenilenmeden, arka planda PHP ile veritabanı sorgulanır ve sonuçlar anlık olarak kullanıcıya sunulur. Bu işlem için JavaScript (AJAX) köprü görevini üstlenir.
İlk olarak, gelen arama terimini veritabanında arayacak ve sonuçları HTML olarak döndürecek PHP dosyamızı oluşturalım. Güvenlik için PDO ve LIKE operatörünü kullanacağız.
Kullanıcının veri gireceği bir input alanı ve sonuçların görüneceği bir boş div alanı hazırlayalım.
Kullanıcı klavyeden bir tuşa bastığında PHP dosyasına veriyi gönderen ve gelen yanıtı ekrana basan sihirli kod:
Canlı arama sistemi, modern web projelerinin standart bir parçasıdır. PHP'nin veritabanı gücü ile JavaScript'in hızı birleştiğinde, kullanıcıların aradıkları içeriğe ulaşmaları saniyeler sürer. Bu sistemi kurarken veritabanı indekslerini (özellikle aranan sütun için) doğru yapılandırdığınızdan emin olun.
1. Veritabanı Sorgusu: search.php
İlk olarak, gelen arama terimini veritabanında arayacak ve sonuçları HTML olarak döndürecek PHP dosyamızı oluşturalım. Güvenlik için PDO ve LIKE operatörünü kullanacağız.
PHP:
<?php
require_once 'Database.php'; // Daha önce oluşturduğumuz DB sınıfı
if (isset($_POST['query'])) {
$db = Database::getInstance()->getConnection();
$arama = "%" . $_POST['query'] . "%";
$sorgu = $db->prepare("SELECT id, kullanici_adi FROM uyeler WHERE kullanici_adi LIKE :ara LIMIT 5");
$sorgu->execute(['ara' => $arama]);
$sonuclar = $sorgu->fetchAll();
if ($sonuclar) {
foreach ($sonuclar as $satir) {
echo "<div class='search-item'>" . htmlspecialchars($satir['kullanici_adi']) . "</div>";
}
} else {
echo "<div class='no-result'>Sonuç bulunamadı.</div>";
}
}
?>
2. Ön Yüz: HTML ve CSS
Kullanıcının veri gireceği bir input alanı ve sonuçların görüneceği bir boş div alanı hazırlayalım.
HTML:
<input type="text" id="aramaKutusu" placeholder="Üye ara..." autocomplete="off">
<div id="sonucAlani"></div>
<style>
#sonucAlani {
border: 1px solid #ddd;
display: none; /* Başlangıçta gizli */
position: absolute;
background: #fff;
width: 200px;
}
.search-item { padding: 10px; cursor: pointer; }
.search-item:hover { background: #f4f4f4; }
</style>
3. Motor: JavaScript (AJAX)
Kullanıcı klavyeden bir tuşa bastığında PHP dosyasına veriyi gönderen ve gelen yanıtı ekrana basan sihirli kod:
JavaScript:
document.getElementById('aramaKutusu').addEventListener('keyup', function() {
let query = this.value;
let sonucAlani = document.getElementById('sonucAlani');
if (query.length > 2) { // 2 karakterden fazla girilirse ara
fetch('search.php', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'query=' + encodeURIComponent(query)
})
.then(response => response.text())
.then(data => {
sonucAlani.innerHTML = data;
sonucAlani.style.display = 'block';
});
} else {
sonucAlani.style.display = 'none';
}
});
Canlı Arama Sistemi Avantaj Tablosu
| Özellik | Klasik Arama | Canlı Arama (AJAX) |
|---|---|---|
| Hız | Yavaş (Sayfa yenilenir) | Çok Hızlı (Anlık) |
| Kullanıcı Deneyimi | Düşük | Çok Yüksek |
| Sunucu Yükü | Yüksek (Tüm sayfa yüklenir) | Düşük (Sadece veri döner) |
4. Profesyonel İpuçları
[] Debouncing (Geciktirme): Her tuşa basıldığında sorgu göndermek yerine, kullanıcı yazmayı bitirdikten 300ms sonra sorgu göndermek sunucu yükünü %70 azaltır.
[] Karakter Sınırı: Sorgunun en az 2 veya 3 karakterden sonra başlamasını sağlayın (Örn: query.length > 2).
[] Güvenlik: Gelen veriyi her zaman htmlspecialchars() ile temizleyin, XSS açıklarına karşı korunun.
[] Limit Kullanımı: Canlı sonuçlarda yüzlerce kayıt göstermeyin; LIMIT 5 veya LIMIT 10 her zaman daha estetiktir.
Sonuç
Canlı arama sistemi, modern web projelerinin standart bir parçasıdır. PHP'nin veritabanı gücü ile JavaScript'in hızı birleştiğinde, kullanıcıların aradıkları içeriğe ulaşmaları saniyeler sürer. Bu sistemi kurarken veritabanı indekslerini (özellikle aranan sütun için) doğru yapılandırdığınızdan emin olun.