PHP Dersleri

PDO ile Site İçi Arama İşlemi(PDO Like)

Çok gariptir ki PDO üzerinden gelen en çok soru; “PDO ile Site İçi Arama Nasıl Yapılır?” oldu. PDO kodlaması öncesinde yapmış olduğumuz mysql_* li arama sorgusunda bir değişiklik olmadı. Mysqlde Arama İşlemi (Like) dersinde arama işlemiyle ilgili bütün detaylara değinmiştik. Şimdi de bu işlemin, PDO platformunda nasıl yapıldığını inceleyelim. Ama öncelikle gelen bu sorunun neden olduğuna değinelim.

Sanırım soruların PDO ile yapılacak olan arama işlemiyle ilgili gelmesi, git gide bilinçlenen ve prepare ile sorgularını hazırlamak isteyen kişilerin artmasından dolayı çok sıkça sorulur oldu. Biliyorsunuz ki prepare kullanıldığında execute ile belirlenen değerin karşılığını belirtmemiz gerekiyor. Fakat site içi arama işlemi sırasında hazırladığımız sorgunun WHERE kısmında bir karşılık bulunmuyor. Durum böyle olunca da; nasıl yapabilirim ben bunu gibi sorular akın akın geliyor.

Sorgunun nasıl olduğuna geçmeden önce, execute ve ?(Soru İşareti) ilişkisine bir değinmek istiyorum. Öncelikle yapmış olduğumuz sorularda, ?(Soru İşareti) ile belirttiğimiz yerin bir karşılığının olması şart değil. Yani, WHERE id=? şeklinde bir değer girebileceğimiz gibi WHERE ? şeklinde değer girişi yapabiliriz.

Site içi arama işlemi, kullanıcıdan gelecek olan değerler ile işlem gördüğünden dolayı, prepare kullanmak zorundayız. Prepare, belirli güvenlik açıklarını önlediğinden dolayı tercih edilmektedir. Arama işlemi Veri Tabanı ile direkt olarak ilişkide bulunduğundan dolayı güvenlik konusu göz ardı edilmemelidir.

Arama işlemleri genelde başlık üzerinden gerçekleştirilmektedir. Bunun yanı sıra kısa içerik üzerinden de aramalar yapılmaktadır. Biz bu makale de başlıklar üzerinden 3 farklı şekilde arama gerçekleştireceğiz.

1 – Kullanıcıdan Gelen Değer İle Başlayan Verileri Listeleme

Kullanıcıdan gelecek olan değerin, başlangıç kelimesi olarak tanımlamak için, aramayı belirten değişkenin sonuna %(Yüzde) noktalama işareti yazılır. Böylelikle değişkenden gelen değerden sonrasının listelenmesi beklenir. Örneğin; PDO ile Site İçi Arama İşlemi | PDO Like makalesine ulaşmak için bu sorgu yöntemi kullanılarak PDO kelimesiyle aranması mümkün olacaktır.

$Gelen = $_GET["ara"]; // Kullanıcıdan gelen arama değeri
$Ara = $db->prepare("SELECT * FROM makale WHERE baslik LIKE ? LIMIT 10"); // Arama sorgusu ve limit belirtme
$Ara->execute(array($Gelen.'%')); // "?" ifadesinin karşılığını belirtme | x ile başlayan ifadeyi temsil eder.
$Liste = $Ara->fetchAll(PDO::FETCH_ASSOC); // Veri çekmek için kullanılacak olan değişken
if($Ara->rowCount() != "0"){ // Aranan kelimeye göre veri varsa
   foreach($Liste as $Bas){
      echo $Bas["baslik"]."<hr>";
    }
}else{ // Aranan kelimeye göre veri yoksa
   echo "Aranan kelimeye göre veri bulunamadı :( ";
}

Yukarıdaki gibi sorguyu hazırladığımızda, kullanıcıdan gelecek olan veriyle başlayan makale başlıkları listelenecektir. Arama sorgusunda belirtmiş olduğum LIMIT zorunlu değildir. Fakat arama çıktısı olarak belirli sayıda sonuç göstermek isterseniz o zaman LIMIT değerini kullanabilirsiniz.

2 – Kullanıcıdan Gelen Değer İle Biten Verileri Listeleme

Kullanıcıdan gelecek olan değerin, bitiş kelimesi olarak tanımlamak için, aramayı belirten değişkenin başına %(Yüzde) noktalama işareti yazılır. Böylelikle değişkenden gelen değerin öncesinin listelenmesi beklenir. Örneğin; PDO ile Site İçi Arama İşlemi | PDO Like makalesine ulaşmak için bu sorgu yöntemi kullanılarak Like kelimesiyle aranması mümkün olacaktır.

$Gelen = $_GET["ara"]; // Kullanıcıdan gelen arama değeri
$Ara = $db->prepare("SELECT * FROM makale WHERE baslik LIKE ? LIMIT 10"); // Arama sorgusu ve limit belirtme
$Ara->execute(array('%'.$Gelen)); // "?" ifadesinin karşılığını belirtme | x ile biten ifadeyi temsil eder.
$Liste = $Ara->fetchAll(PDO::FETCH_ASSOC); // Veri çekmek için kullanılacak olan değişken
 if($Ara->rowCount() != "0"){ // Aranan kelimeye göre veri varsa
   foreach($Liste as $Bas){
   echo $Bas["baslik"]."<hr>";
 }
}else{ // Aranan kelimeye göre veri yoksa
   echo "Aranan kelimeye göre veri bulunamadı :( ";
}

Yukarıdaki gibi sorguyu hazırladığımızda, kullanıcıdan gelecek olan veriyle biten makale başlıkları listelenecektir. Şuana kadar pek kullanıldığını görmediğimden dolayı çok sıklıkla kullanılan bir arama türü olduğunu söyleyemem.

3 – Kullanıcıdan Gelen Değerin Herhangi Bir Yerinde Bulunan Verileri Listeleme

Kullanıcıdan gelecek olan değerin, arama yapılan sütundaki verilerin herhangi bir yerinde bulunması durumunda listelenmesini sağlamak için, aramayı belirten değişkenin başına ve sonuna %(Yüzde) noktalama işareti yazılır. Böylelikle değişkenden gelen değere sahip olan bütün verilerin listelenmesi sağlanır. Örneğin; PDO ile Site İçi Arama İşlemi | PDO Like makalesine ulaşmak için bu sorgu yöntemi kullanılarak PDO, Arama, İşlemi, Like, Site kelimelerinden birisinin kullanılması durumunda aranması mümkün olacaktır.

$Gelen = $_GET["ara"]; // Kullanıcıdan gelen arama değeri
$Ara = $db->prepare("SELECT * FROM makale WHERE baslik LIKE ? LIMIT 10"); // Arama sorgusu ve limit belirtme
$Ara->execute(array('%'.$Gelen.'%')); // "?" ifadesinin karşılığını belirtme | içerisinde x ifadesini olan verileri temsil eder.
$Liste = $Ara->fetchAll(PDO::FETCH_ASSOC); // Veri çekmek için kullanılacak olan değişken
if($Ara->rowCount() != "0"){ // Aranan kelimeye göre veri varsa
foreach($Liste as $Bas){
echo $Bas["baslik"]."<hr>";
}
}else{ // Aranan kelimeye göre veri yoksa
 echo "Aranan kelimeye göre veri bulunamadı :( ";
}

Yukarıdaki gibi sorguyu hazırladığımızda, kullanıcıdan gelecek olan verinin bulunduğu makale başlıkları listelenecektir.

PDO ile arama işlemi yukarı yer alan örneklerdeki gibi yapılmaktadır. Bir de bunun anahtar tanımlayarak yapılacak olan sorgu türü de mevcuttur. İki sorgu türü de aynı işlemi yaptığından dolayı onunla ilgili diğer örnekleri listelemek istemediğinden dolayı sadece bir sorgu örneği kullanarak ona da değinmiş olalım.

Anahtar Belirterek Arama İşleminin Yapılması

Buradaki anahtar, aranacak olan verinin durumunu belirtmek için kullanılan bir ifade değildir. Execute verisi içerisinde yer alacak olan Array değerinde tanımlanan anahtardır. Bu sorgu türüyle kodlama yapanların da olduğunu düşündüğümden dolayı, anahtarlı sorgu kullanımına da değinmek istedim.

$Ara = $db->prepare("SELECT * FROM makale WHERE baslik LIKE :ara LIMIT 10");
$Ara->execute(array( ':ara' => '%'.$Gelen.'%'));

Yukarıdaki sorguda yer aldığı gibi bir anahtar belirterek sorgularınızı düzenleyebilirsiniz. Kodlama alışkanlığınıza hangisi uyuyorsa istediğinizi kullanmakta özgürsünüz. İki türde de bir farklılık yoktur. Tamamıyla kullanım şekline göre değişen sorgu biçimdir.

İlgili Makaleler

Bir Yorum

  1. Hocam php ye ilk başladığımda sizin derslerinizle tanıştım çok güzel anlatım bu şekilde herkes anlatamıyor ama
    veri tabanı işlemlerine geldiğimde kodlar değişmiş çalışamadım çok üzüldüm sene zannediyorum 2019 olacak
    sizin yeni derslerinize youtubede rastlayamadım şimdi google den araştırma yaparken sizi gördüm ve yeni yazınızı
    gördüm. Bir emlak sitesi yaptım ilan gösterme bölümünde detaylı arama kısmını birine yaptırmıştım şimdi irtibat
    koptu bu sayfaya başka bir el karıştı mahvetti çalışmıyor sitenin her tarafı tamam bana yardımcı olacak birini
    arıyorum ücreti konuşuruz selamlar iyi çalışmalar.

Bir yanıt yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir