Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]problem z wyszukiwarką
Forum PHP.pl > Forum > Przedszkole
hankos0
Witajcie!
Mam skrypt (poniżej) wyszukiwarki. Wyszukiwarka ma szukać danych z dwóch tabel.
Skrypt zachowuje się poprawnie (zgodnie z oczekiwaniami) jeśli przeszukuję tylko jedną tabelę. Przy moich wielokrotnych próbach dodania do zapytania drugiej tabeli albo wyświetla mi : "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /search2.php on line 83" albo nie wyszukuje niczego, albo wyświetla zawartość wszystkich pól tabel (klienci i detale).

  1. echo'<form action="search2.php" method="post">';
  2. echo "<br>wpisz miasto <br>";
  3. echo'<input type="text" name="miasto" id="miasto" value="">';
  4. echo "<br>wpisz imie <br>";
  5. echo'<input type="text" name="imie" id="imie" value=""><br/>';
  6. echo "<br>wpisz materialy <br>";
  7. echo'<input type="text" name="materialy" id="materialy" value=""><br/>';
  8.  
  9.  
  10. echo'<input type="submit" name="znajdz" value="znajdz"><br/>';
  11. echo'<input type="reset" value="wyczyść">';
  12. echo'</form>';
  13.  
  14. if(isset($_POST['znajdz']))
  15. {
  16. $miasto = $_POST['miasto'];
  17. $imie = $_POST['imie'];
  18. $materialy = $_POST['materialy'];
  19.  
  20. $wh = array();
  21.  
  22. if (!empty($_POST['miasto']))
  23. $wh[] = "miasto = '$_POST[miasto]'";
  24. if (!empty($_POST['imie']))
  25. $wh[] = "imie = '$_POST[imie]'";
  26. if (!empty($_POST['materialy']))
  27. $wh[] = "materialy = '$_POST[materialy]'";
  28.  
  29. if (!empty($wh))
  30. $where = 'where '.implode(' and ', $wh);
  31. else
  32. $where = '';
  33. $zapytanie = 'SELECT klienci.klient_id, klienci.imie, klienci.nazwisko, klienci.miasto, details.klient_id, details.materialy FROM klienci, details WHERE klienci.klient_id = details.klient_id AND '.$where;
  34. $wynik = mysql_query($zapytanie);
  35.  
  36. echo "<table>";
  37. echo "<tr>";
  38. echo "<td> miasto </td>";
  39. echo "<td> imie </td>";
  40. echo "<td> nazwisko </td>";
  41. echo "<td> materialy </td>";
  42. echo "<tr>";
  43. while ($row = mysql_fetch_array ($wynik) )
  44. {
  45. echo "<tr>";
  46. echo "<td>{$row['miasto']}</td>";
  47. echo "<td>{$row['imie']}</td>";
  48. echo "<td>{$row['nazwisko']}</td>";
  49. echo "<td>{$row['materialy']}</td>";
  50. echo "<tr>";
  51. }
  52. echo "</table>";
  53. }
  54.  


Proszę o sugestie jak powinno wyglądać to nieszczęsne zapytanie, a może wogóle w całym kodzie coś pokręciłam.
lamcpp
NIe łączy się w ten sposob dwóch tabel:
  1. <li class="li1">$zapytanie = 'SELECT klienci.klient_id, klienci.imie, klienci.nazwisko, klienci.miasto, details.klient_id,<li class="li1"> details.materialy FROM klienci, details WHERE klienci.klient_id = details.klient_id AND '.$where;

ale tak
  1. $zapytanie = 'SELECT klienci.klient_id,klienci.imie,klienci.nazwisko,klienci.miasto,details.klient_id
    ,details.materialy FROM
  2. klienci LEFT OUTER JOIN details ON(klienci.klient_id = details.klient_id) AND cośtamćosttam


zamiast LEFT OUTER JOIN możesz użyć RIGHT OUTER JOIN, wszystko zależy od tego w której kolumnie możesz mieć wartości NULL i co ma być wyswietlane.
A co do kodu PHP to mądrzejsi koledzy się wypowiedząsmile.gif
jasin
Poczytaj o
  1. JOIN
.

A takie coś zadziała:
  1. if (!empty($_POST['miasto']))
  2. {
  3. $wh[] = "k.miasto = '$_POST[miasto]'";
  4. }
  5.  
  6. if (!empty($_POST['imie']))
  7. {
  8. $wh[] = "k.imie = '$_POST[imie]'";
  9. }
  10.  
  11. if (!empty($_POST['materialy']))
  12. {
  13. $wh[] = "d.materialy = '$_POST[materialy]'";
  14. }
  15.  
  16.  
  17. if (!empty($wh))
  18. {
  19. $where = 'where '.implode(' and ', $wh);
  20. }
  21. else
  22. {
  23. $where = '';
  24. }
  25.  
  26. $zapytanie = 'SELECT k.klient_id, k.imie, k.nazwisko, k.miasto, d.klient_id, d.materialy FROM klienci k JOIN details d ON k.klient_id = d.klient_id WHERE '.$where;
hankos0
  1.  
  2.  
  3. if(isset($_POST['znajdz']))
  4. {
  5. $miasto = $_POST['miasto'];
  6. $imie = $_POST['imie'];
  7. $materialy = $_POST['materialy'];
  8.  
  9. $wh = array();
  10.  
  11. if (!empty($_POST['miasto']))
  12. $wh[] = "miasto = '$_POST[miasto]'";
  13. if (!empty($_POST['imie']))
  14. $wh[] = "imie = '$_POST[imie]'";
  15. if (!empty($_POST['materialy']))
  16. $wh[] = "materialy = '$_POST[materialy]'";
  17.  
  18. if (!empty($wh))
  19. $where = 'where '.implode(' and ', $wh);
  20. else
  21. $where = '';
  22.  
  23.  
  24. $zapytanie = 'SELECT klienci.klient_id,klienci.imie,klienci.nazwisko,klienci.miasto,details.klient_id
    ,details.materialy FROM klienci LEFT OUTER JOIN details ON(klienci.klient_id = details.klient_id) AND'
    .$where;
  25. $wynik = mysql_query($zapytanie);
  26.  
  27.  
  28. echo "<table>";
  29. echo "<tr>";
  30. echo "<td> miasto </td>";
  31. echo "<td> imie </td>";
  32. echo "<td> nazwisko </td>";
  33. echo "<td> materialy </td>";
  34. echo "<tr>";
  35. while ($row = mysql_fetch_array ($wynik) )
  36. {
  37. echo "<tr>";
  38. echo "<td>{$row['miasto']}</td>";
  39. echo "<td>{$row['imie']}</td>";
  40. echo "<td>{$row['nazwisko']}</td>";
  41. echo "<td>{$row['materialy']}</td>";
  42. echo "<tr>";
  43. }
  44. echo "</table>";
  45.  
  46.  
  47. }
  48.  


Też "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /search2.php on line 83"
To samo w propozycji jasin'a




jasin
To daj np.
  1. $zapytanie = 'SELECT klienci.klient_id,klienci.imie,klienci.nazwisko,klienci.miasto,details.klient_id
  2. ,details.materialy FROM klienci LEFT OUTER JOIN details ON(klienci.klient_id = details.klient_id) AND'.$where;
  3.  
  4. echo $zapytanie; exit;
  5.  
  6. $wynik = mysql_query($zapytanie);


wklej wynik do np. phpmyadmina i tam sprawdź co zwróci Ci mysql.
hankos0
Cytat(jasin @ 30.11.2009, 16:58:44 ) *
To daj np.
  1. $zapytanie = 'SELECT klienci.klient_id,klienci.imie,klienci.nazwisko,klienci.miasto,details.klient_id
  2. ,details.materialy FROM klienci LEFT OUTER JOIN details ON(klienci.klient_id = details.klient_id) AND'.$where;
  3.  
  4. echo $zapytanie; exit;
  5.  
  6. $wynik = mysql_query($zapytanie);


wklej wynik do np. phpmyadmina i tam sprawdź co zwróci Ci mysql.

Odpowiedź jaką dostałam:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where miasto = 'warszawa' and imie = 'piotr' and materialy = 'motor' LIMIT 0, 30' at line 1

SELECT klienci.klient_id, klienci.imie, klienci.nazwisko, klienci.miasto, details.klient_id, details.materialy
FROM klienci
LEFT OUTER JOIN details ON ( klienci.klient_id = details.klient_id )
AND WHERE miasto = 'warszawa'
AND imie = 'piotr'
AND materialy = 'motor'
LIMIT 0 , 30
jasin
Cytat(hankos0 @ 30.11.2009, 17:34:30 ) *
Odpowiedź jaką dostałam:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where miasto = 'warszawa' and imie = 'piotr' and materialy = 'motor' LIMIT 0, 30' at line 1

SELECT klienci.klient_id, klienci.imie, klienci.nazwisko, klienci.miasto, details.klient_id, details.materialy
FROM klienci
LEFT OUTER JOIN details ON ( klienci.klient_id = details.klient_id )
AND WHERE miasto = 'warszawa'
AND imie = 'piotr'
AND materialy = 'motor'
LIMIT 0 , 30


a więc jak widać masz tu błąd w zapytaniu. Powinno wyglądać:
  1. $zapytanie = 'SELECT klienci.klient_id,klienci.imie,klienci.nazwisko,klienci.miasto,details.klient_id
    , details.materialy FROM klienci LEFT OUTER JOIN details ON(klienci.klient_id = details.klient_id) '
    .$where;
hankos0
Cytat(jasin @ 30.11.2009, 17:48:42 ) *
a więc jak widać masz tu błąd w zapytaniu. Powinno wyglądać:
  1. $zapytanie = 'SELECT klienci.klient_id,klienci.imie,klienci.nazwisko,klienci.miasto,details.klient_id
    , details.materialy FROM klienci LEFT OUTER JOIN details ON(klienci.klient_id = details.klient_id) '
    .$where;


No tak, poprawiłam zapytanie. Teraz po zapytaniu do bazy przez phpmyadmin zwraca mi piękny zielony znaczek smile.gif , ale po wykonaniu zapytania na stronie nie zwraca wyników.
  1. echo'<form action="search2.php" method="post">';
  2. echo "<br>wpisz miasto <br>";
  3. echo'<input type="text" name="miasto" id="miasto" value="">';
  4. echo "<br>wpisz imie <br>";
  5. echo'<input type="text" name="imie" id="imie" value=""><br/>';
  6. echo "<br>wpisz materialy <br>";
  7. echo'<input type="text" name="materialy" id="materialy" value=""><br/>';
  8. echo'<input type="submit" name="znajdz" value="znajdz"><br/>';
  9. echo'<input type="reset" value="wyczyść">';
  10. echo'</form>';
  11.  
  12. if(isset($_POST['znajdz']))
  13. {
  14. $miasto = $_POST['miasto'];
  15. $imie = $_POST['imie'];
  16. $materialy = $_POST['materialy'];
  17.  
  18. $wh = array();
  19.  
  20. if (!empty($_POST['miasto']))
  21. $wh[] = "miasto = '$_POST[miasto]'";
  22. if (!empty($_POST['imie']))
  23. $wh[] = "imie = '$_POST[imie]'";
  24. if (!empty($_POST['materialy']))
  25. $wh[] = "materialy = '$_POST[materialy]'";
  26.  
  27. if (!empty($wh))
  28. $where = 'where '.implode(' and ', $wh);
  29. else
  30. $where = '';
  31.  
  32.  
  33. $zapytanie = 'SELECT klienci.klient_id,klienci.imie,klienci.nazwisko,klienci.miasto,details.klient_id
    , details.materialy FROM klienci LEFT OUTER JOIN details ON(klienci.klient_id = details.klient_id) '
    .$where;
  34. $wynik = mysql_query($zapytanie);
  35.  
  36. echo "<table>";
  37. echo "<tr>";
  38. echo "<td> miasto </td>";
  39. echo "<td> imie </td>";
  40. echo "<td> nazwisko </td>";
  41. echo "<td> materialy </td>";
  42. echo "<tr>";
  43. while ($row = mysql_fetch_array ($wynik) )
  44. {
  45. echo "<tr>";
  46. echo "<td>{$row['miasto']}</td>";
  47. echo "<td>{$row['imie']}</td>";
  48. echo "<td>{$row['nazwisko']}</td>";
  49. echo "<td>{$row['materialy']}</td>";
  50. echo "<tr>";
  51. }
  52. echo "</table>";
  53.  
  54.  
  55. }



tzn, jeśli wpisze tylko miasto i imię jest OK , zwraca tak, jak być powinno czyli miasto, imie, nazwisko, materialy.
Ale jeśli uzupełnię również trzecie pole materialy (z tabeli details) to nie wyświetla niczego

Problem rozwiązany.
Nie wyświetlało wyników na stronie, ponieważ w polu 'materialy' nie było pojedynczych słów jak w pozostałych polach, a mogły się znaleść również ciągi znaków oddzielone spacjami, lub przecinkami. Zamieniłam
  1. $wh[] = "materialy = '$_POST[materialy]'";

na
  1. $wh[] = "materialy LIKE '%$materialy%'";


Zapytanie pozostało bez zmian.
Wszystko śmiga aż miło.
Wielkie dzięki za pomoc.

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.