Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]problem z wyszukiwarką
hankos0
post 30.11.2009, 15:38:48
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 5.10.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
lamcpp
post 30.11.2009, 15:50:43
Post #2





Grupa: Zarejestrowani
Postów: 372
Pomógł: 2
Dołączył: 10.05.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
jasin
post 30.11.2009, 15:53:53
Post #3





Grupa: Zarejestrowani
Postów: 142
Pomógł: 32
Dołączył: 21.08.2008
Skąd: Toruń

Ostrzeżenie: (0%)
-----


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;


--------------------
Go to the top of the page
+Quote Post
hankos0
post 30.11.2009, 16:50:43
Post #4





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 5.10.2009

Ostrzeżenie: (0%)
-----


  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




Go to the top of the page
+Quote Post
jasin
post 30.11.2009, 16:58:44
Post #5





Grupa: Zarejestrowani
Postów: 142
Pomógł: 32
Dołączył: 21.08.2008
Skąd: Toruń

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
hankos0
post 30.11.2009, 17:34:30
Post #6





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 5.10.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
jasin
post 30.11.2009, 17:48:42
Post #7





Grupa: Zarejestrowani
Postów: 142
Pomógł: 32
Dołączył: 21.08.2008
Skąd: Toruń

Ostrzeżenie: (0%)
-----


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;


Ten post edytował jasin 30.11.2009, 17:49:17


--------------------
Go to the top of the page
+Quote Post
hankos0
post 1.12.2009, 17:55:04
Post #8





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 5.10.2009

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 11.06.2024 - 01:32