PHP MYSQL ile Arama Modülleri

Kayıt
7 Haziran 2008
Mesaj
533
Tepki
6
PHP-MySQL kullanarak bir site içi arama modülü hazırlama aslında o kadar da zor değil. Sadece ne yapacağınızı bilmeniz yeterli... Serbest yazılımın web dünyasına armağanı olan PHP MYSQL ikilisi gerek hız gerekse güvenlik avantajlarından dolayı web geliştiricileri tarafından tercih edilmeye başlandı. Arama modülü yapmak web yazılımı geliştirenlerin karşılaşacağı biraz incelik gerektiren bir görevdir. Arama modülünün teknik detaylarını konuşmadan önce PHP MYSQL ikilisinin bu uygulama için avantajlarını ve dezavantajlarını sıralayalım;

Veritabanında arama yaparken aranan kelimeleri tablolarladaki alanlardaki değerlerle karşılaştırıp sonuçları bu karşılaştırmalara göre sıralamak isteriz. Tablolardaki alanların değerlerini aranan kelimelerle iki yolla karşılaştırabiliriz.

Birinci yol veritabanından sorgu yaparken SQL sorgusu içinde aranan kelimeleri kullanarak seçim yapmaktır. Boyle sorgular için maalesef MYSQL fazla seçenek sunmuyor. Sadece "LIKE ","=" ve "!=" kullanarak alan değerlerini aranan kelimelerle karşılaştırabiliriz. Örnek vermek gerekirse $keyword aradığımız kelime olsun $tablo da arama yapacağımız tablo olsun.

"SELECT * FROM '$tablo' WHERE 'field1' LIKE '%$keyword' "
"SELECT * FROM '$tablo' WHERE 'field1' LIKE '$keyword%' "
"SELECT * FROM '$tablo' WHERE 'field1' LIKE '%$keyword%' "
"SELECT * FROM '$tablo' WHERE 'field1' ='$keyword' "
"SELECT * FROM '$tablo' WHERE 'field1' !='%$keyword%' "

Birinci sorgu içinde $keyword ile biten kelime barındıran field1 değerlerine sahip satırları elde etmemizi sağlar. İkinci sorgu $keyword ile başlayan kelime barındıran field1 değerlerine sahip bütün satırları, üçüncü sorgu ilk iki sorguyu kapsar ve içinde herhangibir şekilde $keyword geçen kelime barındıran bütün satırları getir. Dördüncü sorgu field1 değerinin birebir eşit olduğu satırları getirir. Beşinci sorgu dördüncü sorgunun tam tersini yapar. MYSQL ın bize bu konuda sunduğu yardımcı araçlar sadece bunlardır. Arama modülü teknik detaylarından bahsederken bu araclarla yapabileceklerimizi sıralayacağız.

İkinci yolumuz veritabanından verileri direkt çekerek PHP metin araçlarını kullanarak veritabanından çektiğimiz bilgileri değerlendirip sonuçları oluşturmak.Örneğin "SELECT * FROM '$tablo' " sorgusuyla elde ettiğimiz satırları PHP de işleyerek sonuç döndürebiliriz.

Her iki yolun yapabildikleri ve yapamadıkları vardır. Kişisel görüşüm iki yolun uygun bir şekilde birleştirilerek kullanılması gerektiği yönündedir. Yapacağımız uygulama örneğinde ikinci yolu kullanacağız. Arama uygulamamıza başlayabiliriz.

Kodlama yapmadan önce arama işlemleri için bir plan yapmalıyız. Aramayı hangi tablolarda yapacağımıza karar verelim. Örneğin forum arama modülü yapıyorsak sadece forum tablolarına bakmamız gerekir. Arama yapılacak tabloları veritabanımızda başka bir tabloda tutarak bu işlemi dinamik hale getirebiliriz. Aynı tabloda arama yapılacak tabloların arama kriterinin karşılaştırılacağı alan adları da tutularak arama işlemlerinin dinamikliği artırılabilir. Arama sorguları veritabanından getireceğimiz alan adlarını da ana tablomuza eklersek arama modülümüzü sağlamlaştırırız. Eğer arama işlemleri bu özelliklerde bir ana tablodan başlatılırsa arama modülümüz oldukça esnek olur. Mesela forumlar için yapılmış bir modül sadece ana tablodaki bilgiler değiştirilerek ürün arama modülüne çevirilebilir. Ek olarak arama kriterleri ile ilgili bir formatın da oluşturulması gerekir. Anahtar kelime olarak sadece bir kelime mi girilecek yada birden fazla kelime kullanılacak mı? .
Anahtar kelimeler arasında özelliklerde işaretler (", + ,- ,ve,veya gibi ) kullanılacak mı? . Planımızı yaptıktan sonra kod yazmaya başlayabiliriz.

Uygulamamızda ürün arama modülü yaptığımızı düşünelim. Aranan kelime olarak birden fazla kelime girilmesine izin verelim. "ve", "veya", kullanımı da uygulamamızda yer alsın . İlk önce ana tablomuzu oluşturalım. Ana tablomuza ürün tablolarını ve alan adlarını eklerken dikkat etmemiz gereken tabloların alanlarından ürünün bütün özelliklerini oluşturacak bir küme oluşturmaktır. Gereksiz alanların listeye alınması hem arama işlemlerini yavaşlatır hem de arama sonuçlarının hata payını yükseltir. Burada bir ayrıntıdan daha bahsetmek yararlı olur.
Ana tablomuzda alan adları ile birlikte alan türlerini de tutarsak arama için oluşturacağımız sorgularda kolaylık sağlayacaktır. Bu konu sorgu oluşturmayı anlatacağımız bölümde daha iyi anlaşılacaktır. Ana tablomuzu oluşturduktan sonra arama işlemlerinin akışına geçebiliriz.

Arama modülümüz için arama yapacak insanların kullanacağı uygun bir arayüz yapmalıyız. Arama kelimelerinin girileceği ve diğer seçeneklerin (ve, veya ) bulunduğu bir form hazırlarız. Bu formun detayları yazımızla ilgili olmadığı için burada daha fazla bahsetmeyi bırakıp arama işlemlerine devam ediyoruz.

Arama işlemlerinin ilk aşaması arama kelimelerinin arama işlemlerinde kullanılacak hale getirilmesidir. Yani birden fazla kelimenin girilmesi durumunda bu kelimelerin uygun bir şekilde ayrıştırılıp gerekli formata sokulmasıdır. Bunun içi0n PHP nin metin duzenleme fonksiyonlarını kullanabiliriz. Arama işlemleri sırasında yapacagımız en önemli iş SQL sorgularını oluşturmaktır. SQL sorgularını ana tablomuzdaki alanlar ve alan türleri ile birlikte kullanıcının sorgulama şekli tercihini ve girdiği arama kelimelerini kullanarak oluşturacağız. Arama sırasında kullacağımız sorgular SELECT sorgularıdır. SELECT sorgusunun ana yapısına ve bizim bu yapıyı nasıl kullanacağımıza geçelim.

SELECT <seçilecek alan adları> FROM <tablo adı> WHERE <sorgu kriterleri>

<seçilecek alan adları> bölümünü ana tablomuzdan çekeceğiz. Burada * kullanarak her tablodaki bütün alanları çekmemezin sebebi tablolarımızın farklı yapıda olabıleceğidir. Burada en önemli ve oluşturulması en zor bölüm <sorgu kriterleri> bölümüdür. Bu bölümde kullanacağımız alan adlarını ve türleri ana tablomuzda saklamıştık. Bu bölüm sorgunun döndüreceği sonuçları belirlediği için sorgumuzun en önemli bölümüdür. Bu bölümü oluşturmada kullanacağımız mantık herbir arama kelimesi için arama yapacağımız tablolardaki alanların herbiriyle karşılaştırıp kullanıcının tercihine göre (ve veya) son sonucu oluşturmaktır. Daha sade bir anlatım için herbir arama kelimesini tablo alanlarıyla karşılaştıracağımız bölüme kelime grubu diyelim. Kelime grubunu şu şekilde oluşturacağız. Aradığımız kelime yi arama yapacagımız tablonun alanlarında tek tek arayacağız.
Aradıgımız kelimenin tabloda baktığımız satırdaki alan değerlerinin sadece birinde olmasını yeterli olduğu için bir kelimeyi tablodaki bütün alanlarla karşılaştırırken `or` mantık işlemcisini kullanacağız. Örneğin tablo1 adındaki bir tabloda kullanıcı tarafından girilen kelime1 , kelime2, kelime3 arama kelimelerini ararken sorgu kriterlerini şöyle oluşturacağız. Ana tablomuzda tablo1 in satırı şöyle olsun
<ana tablomuz>


---------------------------------------------------------------------|

|id|tablo_adı|seçilecek_alanlar|aranacak_alanlar|aranacak_alan_türler|

---------------------------------------------------------------------|

|..| | ............... | .............. | .................. |

|23| tablo1 | fld1,fld2,fld3 | fld2,fld3,fld4 | text,int,varchar |

|..| | ............... | .............. | .................. |

|..| | ............... | .............. | .................. |


tablo1 için SQL sorgumuz şöyle olacaktır

SELECT fld1,fld2,fld3 FROM tablo1 WHERE
(fld2 LIKE `%kelime1%` OR fld3=kelime1 OR fld4 LIKE `%kelime1%) AND
(fld2 LIKE `%kelime2%` OR fld3=kelime2 OR fld4 LIKE `%kelime2%) AND
(fld2 LIKE `%kelime3%` OR fld3=kelime3 OR fld4 LIKE `%kelime3%)

Burada arama kelimelerimizin hepsinin bulunduğu sonuçlarını gösteriyoruz. Arama kelimelerinin herhangibirinin bulunduğu sonuçları göstermek istediğimizde ise `AND` yerine kelime grupları arasında `OR` kullanmamız gerekir. Kelime grupları bölümünde dikkat etmemiz gereken bazı alanlarda karşılaştırma yaparken `LIKE` bazı alanlarda ise `=` kullandığımızdır. `LIKE` işlemcisini text alanları için ve birden fazla kelime barındırabilen varchar alanları için kullanmalıyız. Sayısal değer ve tek kelimelik değerler saklıyan alanlarda ise `=` kullanmalıyız. Bütün alanlar için LIKE kullanmayı da tercih edebiliriz. Bu listelenen sonuç sayısı artırır ve belirli sonuçlar arayan kullanıcılara gereksiz sonuçlar listelenmesine yol açabilir ). SELECT sorgularımızı olusturduktan sonra yapılması gereken dönen sonuçları uygun bir formatta kullanıcıya sunmaktır.

Buraya kadar anlattıklarımızı soyle ozetleyebiliriz. Arama işlemimizin temel işleyişi kullanıcıdan form ile aldığımız kelimeleri ve ana tablomuzdaki herbir satırdaki bilgileri kullanarak SELECT sorgularımızı olusturmak ve dönen sonuçları kullanıcıya listelemektir.

Arama modülümüzün temel işleyişini bitirdik. Şimdi modülümüzü daha işlevsel hale getirmek için yapabileceklerimizi düşünelim. İlk olarak kullanışlı bir ara yüz hazırlamamız gerekir. Kullanıcıya modülü nasıl kullanacağını anlatan uyarı cümlecikleri koymalıyız. Birden fazla kelime girildiğinde kelimelerin nasıl ayrılması gerektiği kullanıcıya söylenmelidir. Modülümüzde arama için kullanılan kelimeleri kaydedip bunları düzenli olarak incelemeliyiz. Bu bize modülün ne amaçlarla kullanıldığı hakkında bilgiler verecektir. Ayrıca bu bilgilerden yola çıkarak ana tablomuzda alanlarla ilgili düzenlemeler yapabiliriz. Modülümüzün işlevselliği ile ilgili bir diğer önemli nokta sonuçların nasıl listeleneceği ve listelenen sonuçların nasıl gösterileceğidir. Sonuçlarımızı belli sayıdaki gruplar halinde göstermemiz kullanıcılar için kolaylık sağlayabilir. Sonuçların listelenme şekli de modülümüzün dahil olduğu sistemle ilgilidir. Burada söylediklerimizin uygulaması ve bu konuda ek olarak yapılabilecekler programlama sınırlarıyla belirlenir.
 
Kayıt
23 Kasım 2007
Mesaj
296
Tepki
59
kardes guzel paylasım yapmıssında okkuyunca sıkıldım valla:D pek bısey anlamdım acıksası:D
 
Yukarı Alt