Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] wadliwa wyszukiwarka
Forum PHP.pl > Forum > Przedszkole
LukasTe
witam,
zmieniłem serwer i wyszukiwarka rekordów z MySQL wyświetla za kazdym razem wszystkie rekordy co by się nie wpisało. Wcześniej było wszystko dobrze. Wrzucam kod pliku search.php

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  4. <link rel="stylesheet" type="text/css" href="arkusz.css" />
  5. <body>
  6. <?php
  7. /*
  8.   połączenie z bazą sobie darujemy
  9.   opisane jest ono w tej poradzie
  10.   <a href="http://www.kess.com.pl/?sid=10&pid=32" target="_blank">http://www.kess.com.pl/?sid=10&pid=32</a>
  11. */
  12. // podłączamy plik connection.php
  13. require "connection.php";
  14. // wywołujemy funkcję connection()
  15. connection();
  16.  
  17. mysql_query("SET NAMES 'utf8'");
  18. mysql_query("SET collation_connection = utf8_general_ci;");
  19. mysql_query("/*!40101 SET character_set_results = NULL */;");
  20.  
  21. /* zapytanie do konkretnej tabeli */
  22. $wyniki=explode(" ",$search);
  23. $warunki=" (nazwa LIKE '%$wyniki[0]%' || nazwa LIKE '%$wyniki[0]%' || nazwa LIKE '%$wyniki[0]%')";
  24. for ($i=1;$i<count($wyniki);$i++)
  25. {
  26. $warunki.=" and (nazwa LIKE '%$wyniki[$i]%' || nazwa LIKE '%$wyniki[$i]%' || nazwa LIKE '%$wyniki[$i]%')";
  27. }
  28. $query="SELECT * FROM lista WHERE $warunki ";
  29. $result = MYSQL_QUERY($query);
  30.  
  31. /*
  32. wyświetlamy wyniki, sprawdzamy,
  33. czy zapytanie zwróciło wartość większą od 0
  34. */
  35. if(mysql_num_rows($result) > 0) {
  36. /* jeżeli wynik jest pozytywny, to wyświetlamy dane */
  37. echo "<div align='center'>";
  38. echo "<table>";
  39. while($r = mysql_fetch_assoc($result)) {
  40. echo "<tr>";
  41. echo "<td class='wiersz1'>".$r['nazwa']."</td>";
  42. echo "<td class='wiersz2'>".$r['rodzaj']."</td>";
  43. echo "<td class='wiersz3'><a target='_blank' href=".$r['link'].">Kliknij</a></td>"; }
  44. echo "</tr>";
  45. echo "</table>";
  46. }
  47.  
  48. ?>
  49. </body>
  50. </head>
  51. </html>
bastard13
dodaj do kodu echo $query i napisz co ci wyrzuca.
LukasTe
  1. echo "<div align='center'>";
  2. echo "<table>";
  3. echo "$query";
  4. while($r = mysql_fetch_assoc($result)) {

Dodałem jak powyżej, nie wiem czy o to chodziło. Wyrzuciło razem z całością tabeli:
  1. SELECT * FROM lista WHERE (nazwa LIKE '%%' || nazwa LIKE '%%' || nazwa LIKE '%%')


Co najgorsze to, że na starym serwerze są identyczne pliki, identyczna tabela w bazie i wszystko działa. Tutaj wyszukuje całość. jedyny plik jaki się rozni to connection.php, łączy z inną bazą, wiadomo inny serwer. Kompletnie tego nie rozumiem.
Podałbym oba adresy list ale nie wiem czy mogę.
bastard13
Zwroc uwage, ze w twoim zapytaniu warunek like odwoluje sie do kazdego mozliwego ciagu (%%).
Zmien oba warunki na:
  1. $warunki=" (nazwa LIKE '%{$wyniki[0]}%' || nazwa LIKE '%{$wyniki[0]}%' || nazwa LIKE '%{$wyniki[0]}%')";
  2. ....
  3. $warunki.=" and (nazwa LIKE '%{$wyniki[$i]}%' || nazwa LIKE '%{$wyniki[$i]}%' || nazwa LIKE '%{$wyniki[$i]}%')";

jezeli echo $query nadal zwroci to samo, to dodaj jeszcze var_dump($wyniki) i wrzuc tutaj to, co ci zwraca.
LukasTe
Wyrzucało to samo, dodałem
  1. echo "<div align='center'>";
  2. echo "<table>";
  3. echo "$query";
  4. var_dump($wyniki);
  5. while($r = mysql_fetch_assoc($result)) {

wyrzuca teraz
  1. SELECT * FROM lista WHERE (nazwa LIKE '%%' || nazwa LIKE '%%' || nazwa LIKE '%%') array(1) { [0]=> string(0) "" }


Najdziwniejsze, że na poprzednim serwerze wyszukiwanie działa, a nic nie zmieniam. niedawno jeszcze raz przerzuciłem pliki, zoptymalizowałem tabele.
bastard13
To jak widzisz masz pusta zmienna $wyniki (a dokladniej, jest tam jeden pusty string). Gdzies ci sie gubia zmienne. Jak widze $wyniki=explode(" ",$search); , wiec zobacz co jest w $search, poniewaz wydaje mi sie, ze jest pusta. Skad ja pobierasz?
LukasTe
Wrzuciłem ten sam plik szukaj.php na stary serwer i już wyświetla normalnie np.
  1. SELECT * FROM lista WHERE (nazwa LIKE '%gta%' || nazwa LIKE '%gta%' || nazwa LIKE '%gta%') array(1) { [0]=> string(3) "gta" }

A jest to samo.. ja dokładnie nie znam się jak przeanalizować każdą część kodu, liste tworzyłem już dawno głownie opierając się na gotowcach z sieci i teraz mam problem cokolwiek w niej zrobić..

A już wiem o które search chodzi. Jest w wyszukiwarce tak:
  1. <center><table>
  2. <form name="form1" method="post" action="index.php?strona=szukaj">
  3. <tr>
  4. </tr>
  5. <tr>
  6. <td>
  7. <input type="text" name="search" size="25"
  8. </td>
  9. <td>
  10. <input type="submit" name="Submit" value="Szukaj>>">
  11. </td>
  12. </tr>
  13. </form>
  14. </table></center>

I powinno pobierać z pola w które sie wpisuje jednak tego nie robi. Doszukuje się różnic na serwerach, w bazach i nic. Nic mi nie przychodzi do głowy, czemu się tak dzieje.. zapytania np. na litery alfabetu lub wg rodzaju wyświetla tu i tu poprawnie.
Może moge jakis inny rodzaj wyszukiwania zastosować?
sebekzosw
zamień
Kod
$wyniki=explode(" ",$search);
na
Kod
$wyniki=explode(" ",$_POST['search']);
krispak
Czyzby tam byl register_globals On a tu jest Off.. Zacznij pobierac zmienna $search normalnie np z $_GET jak wiekszosc wyszukiwarek bo jak narazie to nie wiadomo skad ona jest. Zmien od razu w form z method="post" na get.
LukasTe
Rada sebekzosw pomogła, dzięki wszystkim. Jesteście naprawdę pomocni ale postaram się teraz jak juz będę coś ulepszał bardziej zapamietac co, gdzie, jak i może w końcu nie będe potrzebował pomocy przy każdym problemie jaki sie pojawi. No to tyle.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.