Bazı sorunlar PHP ile MySQL veritabanı arıyor

3 Cevap php

Yani benim mysql veritabanında bir tablo arar bir arama özelliği olan bu web sitesi var. Şu anda veritabanı 1108 satır var. Böyle Sanatçı ve Albüm gibi müzik bilgilerini içerir. Bir sanatçı adı veya albüm adında olmak için her karakter için olası beri, ben veritabanına eklenmeden önce bu değişkenlerin her urlencoded ettik. Aşağıya bakın:

$artist = urlencode($_POST['artist']);
$album = urlencode($_POST['album']);

Yani şimdi ben veritabanına yeni bir giriş ekledik ve urlencoded gereken karakterler içerdiğini iddia sağlar. Veritabanı ince onu gösteriyor.

Şimdi arama gitmek istiyorum.

Yabancı karakterler çalıştı. Sen burada görebilirsiniz: http://albumarrrt.net/details.php?artist=Ai%20Otsuka her biri işleri için albüm linkine tıklayıp.

Ama şimdi bir kaç sorunlar oluşur.

1 - If you search for '&' the search reads the %26 as nothing. It shows %26 in the address bar, but it reads it as nothing. Here is how it is being read:

$search = $_GET['search'];

if($search == '') {
    echo "Please enter a search term :(";
}

Bu veritabanı tarafından okunan almaya başlıyor önce o $ arama ile yapılan tek şeydir.

2 - Bir tek veya çift tırnak için arama yaparsanız, bazı garip şeyler örneği yapar:

Search for " and get No matches found for "%5C%5C%26quot%3B" Search for ' and get No matches found for "%5C%5C%26%23039%3B"

Veritabanı sadece teklif ve başka bir şey için kodunu içeren çünkü, bunu neden yaptığını anlamıyorum.

Bunlar benim arama ile yanlış bulduk sadece iki şey vardır. Belki de ben çok uzun bakarak olmuştur ve bunu bilemiyorum, ama okumak 've' yok neden benim şaşkınlığa düşüren bir şey olarak.


Onto my last question. My current searching method separates each word and adds %'s around it and then uses the LIKE statement to find matches. example:

Search: A bunch of Stuff (word) the mysql query would be like:

SELECT * FROM TABLE WHERE (album LIKE '%A%' AND album LIKE '%bunch%' AND album LIKE '%of%' AND album LIKE '%Stuff%' AND album LIKE '%%28word%29%') OR (artist LIKE '%A%' AND artist LIKE '%bunch%' AND artist LIKE '%of%' AND artist LIKE '%Stuff%' AND artist LIKE '%%28word%29%')

Açıkçası kötü bir fikir bu sunucuda gerginlik bir çok koyuyor, ve ben böyle büyük veritabanı araması için GİBİ ifadeleri kullanarak biliyorum, bu yüzden ne tam metin ya da başka bir yöntem aramaya alternatif bir yolu olurdu?

Soruların ezici miktarda için üzgünüm, ama hepsi sorta birbirleri ile el-ele gidin.


edit: Ok I've fixed my database up, but still have a few questions. Someone suggested to convert my text from utf8 to plain utf, how would I do this?

and I am still getting the problem with the & sign. for example: if you search for & on google it works, however on my site, my POST result for the search query reveals nothing when searching for &.

3 Cevap

  • Birincisi: veritabanındaki verileri UrlEncode yok. Eğer gibi output, HTML, onu getir urlencode veri sonra.

  • İkincisi: SQL sorguları kullanıcı tarafından sağlanan değerleri kullandığınızda sorgu parametrelerini kullanıyoruz. Sonra sözdizimi hataları veya SQL enjeksiyon riskleri neden form verilerini tırnak hakkında endişelenmenize gerek yok.

  • Üçüncüsü: LIKE '%pattern%' hack kullanmayın; yerine (ya FULLTEXT veya Lucene/Solr veya Sphinx Search) yerine gerçek bir tam metin arama çözümü kullanın. Bu (veri sizin hacmine bağlı olarak) ad-hoc metin aramasını kullanarak daha iyi zamanların performansı yüzlerce veya binlerce gerekir.

    MySQL Üniversitesi için yaptım sunumu görmek: Practical Full Text Search in MySQL.

Eğer UrlEncode gerekir neden ben sadece mysql_real_escape_string kullanmak istiyorsunuz, görmüyorum.

'&' önce bunu UrlEncode sürece bu nedenle sizin komut için bir url bir ayırıcı kabul görmeyecektir

Urlencode bir başka sorun ekstra karakterlerin büyük bir sayıdır. Eğer yeterli karakterler için izin varsa mySQL sessizce sanatçı veya başlığı kesecek.

DC

Eğer veritabanında koymadan önce decoding şeyler sizin URL (ve DİREKLERİ) gelen olmak istemiyorum emin misin? Ben çeşitli dizeleri depolamak olsaydı, ben düz UTF falan onları çözmek ve bu şekilde onları saklamak isterim. Sonra bunları görüntülemek için bunları yeniden kodlamak istiyorum. Bu başlı başına ve arama sorunu çözmek olabilir.

İkincisi, dizeleri erişimi arama hızlandırmak için, sizin dizeleri tüm tokenized ve geri bunları içeren dizeleri ile bağlantılı olan bir dizeleri tablo oluşturabilirsiniz. Sonra yerine bir "% 1 $ gibi%" yapmanın size 1 $ = stringTable.String söyleyebiliriz ve bu ID karşı katılın. Ben bu performans tunes kendim yapmadım gibi hiçbir şekilde optimal çözüm olarak saymak, sadece bir öneri.