PHP ile MySQL veritabanı aramak için en iyi yolu nedir?

5 Cevap php

Ben bir MySQL veritabanı kitapların bir tablo vardı ve ben anahtar kelimeler (arama alanına kullanıcı tarafından giriş) için 'title' alanını aramak istedim ki; PHP bunu yapmanın en iyi yolu nedir? MySQL LIKE aramak için en verimli şekilde komuta mi?

5 Cevap

Evet, en etkili yolu, genellikle veritabanında arıyor. Eğer üç seçenek var Bunu yapmak için:

  • LIKE, ILIKE kesin alt dizeleri maç
  • RLIKE POSIX Regexes maç
  • Doğal dil işleme amaçlı arama başka üç çeşit maç için FULLTEXT indeksler

Yani aslında iyi olurdu ne karar vermek için arıyor olacak ne bağlıdır. Kitap başlıkları için ben tam bir alt maçı için GİBİ arama teklif ediyorum, insanlar bir kelime veya kelime benzer başlıkları bulmanıza yardımcı olmak için arayan ve aynı zamanda bir FULLTEXT arama konum kitap biliyorum yararlıdır. Onlara elbette arayüzünde farklı isimler, substring arama ve tam metin arama için benzer için kesin gibi Muhtemelen bir şey vermek istiyorum.

Tam metin hakkında bir örnek: http://www.onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html

İşte bu anahtar kelimeler üzerinde bir sütun filtreleme için bazı maddelerini oluşturmak için bazı kelimeleri ayıramaz basit bir yolu birlikte anded veya ORed ya bulunuyor.

$terms=explode(',', $_GET['keywords']);
$clauses=array();
foreach($terms as $term)
{
    //remove any chars you don't want to be searching - adjust to suit
    //your requirements
    $clean=trim(preg_replace('/[^a-z0-9]/i', '', $term));   
    if (!empty($clean))
    {
         //note use of mysql_escape_string - while not strictly required
         //in this example due to the preg_replace earlier, it's good
         //practice to sanitize your DB inputs in case you modify that
         //filter...
         $clauses[]="title like '%".mysql_escape_string($clean)."%'";
    }
}

if (!empty($clauses))
{   
    //concatenate the clauses together with AND or OR, depending on
    //your requirements
    $filter='('.implode(' AND ', $clauses).')';

    //build and execute the required SQL
    $sql="select * from foo where $filter";
}
else
{
    //no search term, do something else, find everything?
}

Paul Dixon'ın kod örneği GİBİ temelli yaklaşım için iyi genelinde ana fikir alır.

| Arabirim, varsayılan ayarlanan radyo düğmesini VE, sıfır (0) maçta ve bir kullanıcının sorgu sonuçlarını en az iki kelime içeriyorsa, sonra bir seçeneği ile yanıt bir (OR AND) sağlayın: Ben sadece bu kullanılabilirlik fikri ekleyeceğim etkisine:

"Üzgünüm, No matches arama ifade için bulundu. Sizin ifade HERHANGİ kelime maç için arama genişletin?

Belki de bu kelime için daha iyi bir yolu var, ama temel fikir AND ve ameliyathanelerinde Boole mantığı açısından düşünmek zorunda kullanıcı olmadan (that may be successful) başka bir sorgu doğru kişiye rehberlik etmektir.

sphinx kullanmayı düşünün. Bu doğrudan MySQL veritabanı tüketebilir bir açık kaynak kodlu tam metin motoru bulunuyor. Bu GİBİ ifadeleri (ve çok daha az duyarlı SQL enjeksiyon) kodlama el çok daha fazla ölçeklenebilir ve esnek

Ben gibi bu bir kelime ise en etkili yol olduğunu düşünüyorum. Daha önce söylediğimiz gibi, çok sözler patlayabilir fonksiyonu ile bölünebilir. Daha sonra döngüye ve veritabanı üzerinden tek tek aramak için kullanılabilir. Aynı sonuç, iki kez döndü ise, bir diziye değerleri okuyarak kontrol edilebilir. Zaten dizide varsa, bunu görmezden. Sonra sayım fonksiyonu ile, nerede bir döngü ile yazdırma işlemi sırasında durdurmak için bileceksiniz. Sıralama similar_text fonksiyonu ile yapılabilir. Yüzde dizi sıralamak için kullanılmaktadır. İşte en iyisidir.