Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] [php] wyszukiwanie rekordu podając kilka wartości
Forum PHP.pl > Forum > Przedszkole
kononowicz
witam

napisałem w phpie skrypt wyszukujący rekordy z bazy mysql:

  1. <?php
  2. echo'<form action="example.php" method="post">';
  3. echo "<br>wpisz towar <br>";
  4. echo'<input type="text" name="towary" id="towary" value="">';
  5. echo "<br>wpisz kod <br>";
  6. echo'<input type="text" name="kod" id="kod" value="">';
  7. echo "<br>wpisz cenę <br>";
  8. echo'<input type="text" name="cena" id="cena" value="">';
  9.  
  10. echo'<input type="submit" name="znajdz" value="znajdz">';
  11. echo'<input type="reset" value="wyczyść">';
  12. echo'</form>';
  13.  
  14. if(isset($_POST['znajdz']))
  15. {
  16. $towary = $_POST['towary'];
  17. $kod = $_POST['kod'];
  18. $cena = $_POST['cena'];
  19.  
  20. $zapytanie = mysql_query("SELECT *
  21.  FROM `towary`,`dzialy`
  22.  WHERE `towary`.`TOWARY` LIKE '$towary'
  23.  AND `towary`.`KOD` LIKE '$kod'
  24.  AND `towary`.`CENA` LIKE '$cena' ");
  25.  echo "<table cellpadding="1" border=1>";
  26. echo "<tr>";
  27. echo "<td> towary </td>";
  28. echo "<td> kod </td>";
  29. echo "<td> cena </td>";
  30. echo "<td> działy </td>";
  31. echo "<tr>";
  32. while( $wiersz = mysql_fetch_array($zapytanie) )
  33. {
  34.  
  35. echo "<tr>";
  36. echo "<td>".$wiersz['TOWARY']."</td>";
  37. echo "<td>".$wiersz['KOD']."</td>";
  38. echo "<td>".$wiersz['CENA']."</td>";
  39. echo "<td>".$wiersz['ID_DZIALY']."</td>";
  40. echo "<tr>";
  41. }
  42. echo "</table>";
  43.  
  44. mysql_close($connection);
  45. }
  46. ?>


pytanie brzmi jak napisać zapytanie mysqlowe aby wyszukiwał mi rekord przy podaniu kilku wartosci np. podaję nazwe towaru i np. cene a wyszukiwarka wyszukuje mi dany towar. nie wiem jak mam sobie z tym poradzić: albo wyświetla mi kilka razy te same rekordy albo nie wyswietla mi nic (w zaleznosci czy uzyje AND albo OR). Jak powinnien wygladac poprawne wyszukiwanie w MySQLu?questionmark.gifquestionmark.gif? ewentualnie proszę o wszelkie sugestie na temat tego kodu w ogóle...
dtb
przetlumacz to na polski, bo z tego co widze w kodzie i zrozumialem z tresci wynika, ze skrypt wyszukuje zarowno pod wzgledem ceny, jak i nazwy
kononowicz
Cytat(dtb @ 4.12.2006, 05:58:56 ) *
przetlumacz to na polski, bo z tego co widze w kodzie i zrozumialem z tresci wynika, ze skrypt wyszukuje zarowno pod wzgledem ceny, jak i nazwy



no własnie zalezy mi na tym aby skrypt wyswietlał dane w zaleznosci od tego jakie podam dane. jezeli podam tylko np. towar to wyswietla mi wzgledem towaru a jezeli podam towar i cene to wyswietla mi towar o podanej cenie. a jak według ciebie to powinno wyglądać?? zamiast and wpisałem or i teraz mi wyswietla wyniki jednak ten sam rekord wyswietla mi np. 6 razy :/




własnie zauwazyłem dlaczego wyswietlało mi kilka razy te same dane. oto poprawiony kod (jednak dziwnie sie zachowuje i nie szuka wszystkich danych :/):

  1. <?php
  2. echo'<form action="example.php" method="post">';
  3. echo "<br>wpisz towar <br>";
  4. echo'<input type="text" name="towary" id="towary" value="">';
  5. echo "<br>wpisz kod <br>";
  6. echo'<input type="text" name="kod" id="kod" value="">';
  7. echo "<br>wpisz cenę <br>";
  8. echo'<input type="text" name="cena" id="cena" value="">';
  9.  
  10. echo'<input type="submit" name="znajdz" value="znajdz">';
  11. echo'<input type="reset" value="wyczyść">';
  12. echo'</form>';
  13.  
  14. if(isset($_POST['znajdz']))
  15. {
  16. $towary = $_POST['towary'];
  17. $kod = $_POST['kod'];
  18. $cena = $_POST['cena'];
  19.  
  20. $zapytanie = mysql_query("SELECT distinct *  
  21.  FROM
  22.  `towary`
  23.  WHERE `towary`.`TOWARY` LIKE '%$towary%' OR `towary`.`KOD` LIKE '$kod' OR `towary`.`CENA` = '$cena' ");
  24.  
  25.  echo "<table cellpadding="1" border=1>";
  26. echo "<tr>";
  27. echo "<td> towary </td>";
  28. echo "<td> kod </td>";
  29. echo "<td> cena </td>";
  30. echo "<td> działy </td>";
  31. echo "<tr>";
  32. while( $wiersz = mysql_fetch_array($zapytanie) )
  33. {
  34. echo "<tr>";
  35. echo "<td>".$wiersz['TOWARY']."</td>";
  36. echo "<td>".$wiersz['KOD']."</td>";
  37. echo "<td>".$wiersz['CENA']."</td>";
  38. echo "<td>".$wiersz['ID_DZIALY']."</td>";
  39. echo "<tr>";
  40. }
  41. echo "</table>";
  42.  
  43. mysql_close($connection);
  44. }
  45. ?>
Sedziwoj
Jak używasz OR w zapytaniu to szuka jednego lub drugiego, ale jeśli dostajesz w odpowiedzi kilka takich samych rekordów to oznacza, że jest ich kilka w bazie.
Więc jak chcesz aby wyszukany towar spełniał dwa warunki mszą być połączone AND.
Ogólnie sprawdź co w ogóle jest w bazie, bo mam dziwne przeczucie, że jest tam ogromny bałagan.
I jak zawsze doradzam przeczytanie jakiegoś kursu i jeśli sam tworzyłeś tą bazę to również takiego gdzie jest opisane jak powinno się tworzyć takie bazy, bo tu można popełnić sporo błędów.
acztery
a po co distinct questionmark.gif jezeli wpisze ktos cene 2 zł a wiecej produktów bedzie po 2 wyswetli jeden wywal to
acztery
co do ceny po nie lepiej dać between wydawać się ze wlasnie do tego to jest
kononowicz
Cytat(Sedziwoj @ 4.12.2006, 08:34:35 ) *
Jak używasz OR w zapytaniu to szuka jednego lub drugiego, ale jeśli dostajesz w odpowiedzi kilka takich samych rekordów to oznacza, że jest ich kilka w bazie.
Więc jak chcesz aby wyszukany towar spełniał dwa warunki mszą być połączone AND.
Ogólnie sprawdź co w ogóle jest w bazie, bo mam dziwne przeczucie, że jest tam ogromny bałagan.
I jak zawsze doradzam przeczytanie jakiegoś kursu i jeśli sam tworzyłeś tą bazę to również takiego gdzie jest opisane jak powinno się tworzyć takie bazy, bo tu można popełnić sporo błędów.



nie mam bałaganu snitch.gif bo mam tylko kilka testowych rekordów.. a to że wyświetlało mi np. 6 po kazdym rekodzie i jezeli było znalezionych wiecej to na przemian to wina jakiegos błedu w kodzie.


Cytat(nospor @ 4.12.2006, 09:37:21 ) *


nie można tego zrobić prościej, czyli jedna linijką SQLa??



distinct juz usunałem ... sam na to wpadłem tongue.gif



faktycznie between to dobry pomysł. dzieki za rady
nospor
Cytat
nie można tego zrobić prościej, czyli jedna linijką SQLa??
Oczywiscie ze mozna, ale bedzie srednio czytelne tongue.gif
kononowicz
Cytat(nospor @ 4.12.2006, 12:18:54 ) *
Oczywiscie ze mozna, ale bedzie srednio czytelne tongue.gif



a można otrzymać wskazówkę jak to zrobić??
nospor
  1. <?php
  2. $wh = array();if (!empty($_POST['cena_od']))  $wh[] = 'cena >= '.$_POST['cena_od'];if (!empty($_POST['cena_do']))  $wh[] = 'cena <= '.$_POST['cena_do']; if (!empty($wh)) $where = 'where '.implode(' and ', $wh); else $where = ''; $sql = 'select ..... '.$where;
  3. ?>
i masz jedna linijke smile.gif

A na powaznie. Nie ma co sie bawic w jednolinijkowce, gdyz naprawde jesli nawet ci sie uda cos poukladac, to nagle gdy bedziesz musial dolozyc warunkow to bedziesz mial powazny problem z zapanowaniem nad tym. Podany przeze mnie link umozliwia ci w ladny i przyjemny sposob zapanowac nad wszystkim. a to ze jest 5 linijek zamiast jednej.... bez przesady
kononowicz
cos takiego naskrobałem:

  1. <?php
  2. echo'<form action="szukaj1.php" method="post">';
  3. echo "<br>wpisz towar <br>";
  4. echo'<input type="text" name="towary" id="towary" value="">';
  5. echo "<br>wpisz kod <br>";
  6. echo'<input type="text" name="kod" id="kod" value="">';
  7. echo "<br>zakres ceny <br> od:";
  8. echo'<input type="text" name="cena_od" id="cena_od" value="">';
  9. echo " do: ";
  10. echo'<input type="text" name="cena_do" id="cena_do" value="">';
  11. echo'<input type="submit" name="znajdz" value="znajdz">';
  12. echo'<input type="reset" value="wyczyść">';
  13. echo'</form>';
  14.  
  15. if(isset($_POST['znajdz']))
  16. {
  17. $wh = array();
  18. if (!empty($_POST['cena_od']))
  19.  $wh[] = 'CENA >= '.$_POST['cena_od'];
  20. if (!empty($_POST['cena_do']))
  21.  $wh[] = 'CENA <= '.$_POST['cena_do'];
  22. if (!empty($_POST['towary']))
  23.  $wh[] = 'TOWARY <= '.$_POST['towary'];
  24. if (!empty($_POST['kod']))
  25.  $wh[] = 'KOD <= '.$_POST['kod'];
  26.  
  27. if (!empty($wh))
  28.  $where = 'where '.implode(' and ', $wh);
  29. else
  30.  $where = '';
  31. $zapytanie = 'SELECT * FROM `towary` '.$where;
  32.  
  33.  echo "<table cellpadding="1" border=1>";
  34. echo "<tr>";
  35. echo "<td> towary </td>";
  36. echo "<td> kod </td>";
  37. echo "<td> cena </td>";
  38. echo "<td> działy </td>";
  39. echo "<tr>";
  40. while( $wiersz = mysql_fetch_array($zapytanie) )
  41. {
  42. echo "<tr>";
  43. echo "<td>".$wiersz['TOWARY']."</td>";
  44. echo "<td>".$wiersz['KOD']."</td>";
  45. echo "<td>".$wiersz['CENA']."</td>";
  46. echo "<td>".$wiersz['DZIALY']."</td>";
  47. echo "<tr>";
  48. }
  49. echo "</table>";
  50. }
  51. ?>


wyświetla:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/*********/szukaj1.php on line 41
nospor
no ale kolego.... zapytanie to jeszcze trzeba wykonac. O mysql_query() slyszal?
kononowicz
Cytat(nospor @ 4.12.2006, 14:11:38 ) *
no ale kolego.... zapytanie to jeszcze trzeba wykonac. O mysql_query() slyszal?


słyszał słyszał :

  1. <?php
  2. if(isset($_POST['znajdz']))
  3. {
  4.  
  5. $wh = array();
  6. if (!empty($_POST['cena_od']))
  7.  $wh[] = 'CENA >= '.$_POST['cena_od'];
  8. if (!empty($_POST['cena_do']))
  9.  $wh[] = 'CENA <= '.$_POST['cena_do'];
  10. if (!empty($_POST['towary']))
  11.  $wh[] = 'TOWARY <= '.$_POST['towary'];
  12. if (!empty($_POST['kod']))
  13.  $wh[] = 'KOD <= '.$_POST['kod'];
  14. print '<pre>';
  15. print_r($_POST);
  16. print '</pre>';
  17. //.....i tak na kazde pola czyli nie 64 a 8 razy :)
  18. if (!empty($wh))
  19.  $where = 'where '.implode(' and ', $wh);
  20. else
  21.  $where = '';
  22. $zapytanie = 'SELECT * FROM `towary` '.$where;
  23. $wynik = mysql_query($zapytanie);
  24. echo "<table cellpadding="1" border=1>";
  25. echo "<tr>";
  26. echo "<td> towary </td>";
  27. echo "<td> kod </td>";
  28. echo "<td> cena </td>";
  29. echo "<td> działy </td>";
  30. echo "<tr>";
  31. while( $wiersz = mysql_fetch_array($wynik) )
  32. {
  33. echo "<tr>";
  34. echo "<td>".$wiersz['TOWARY']."</td>";
  35. echo "<td>".$wiersz['KOD']."</td>";
  36. echo "<td>".$wiersz['CENA']."</td>";
  37. echo "<td>".$wiersz['DZIALY']."</td>";
  38. echo "<tr>";
  39. }
  40. echo "</table>";
  41. print '<pre>';
  42. print_r($_POST);
  43. print '</pre>';
  44. mysql_close($connection);
  45. }
  46. ?>


wyszukuje mi według ceny i kodu ale towaru jakos nie ...
nospor
no ale co to jest to TOWARY? bo w warunku dales: TOWARY <= . to TOWARY to liczba i ma byc warunek <= ?
Z kodem zreszta podobnie.
kononowicz
Cytat(nospor @ 4.12.2006, 14:26:17 ) *
no ale co to jest to TOWARY? bo w warunku dales: TOWARY <= . to TOWARY to liczba i ma byc warunek <= ?
Z kodem zreszta podobnie.


więc przy TOWARY i KOD zamiast <= powinno byc = lub LIKE questionmark.gif

TOWARY i KOD to pole w tabeli 'towary' ... to jest typ varchar


po wpisaniu LIKE pojawia sie takie cos:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/*******szukaj1.php on line 63
towary kod cena działy

Array
(
[towary] => tow2
[kod] =>
[cena_od] =>
[cena_do] =>
[znajdz] => znajdz
)

1054Unknown column 'tow2' in 'where clause'
nospor
no tak, skoro to napis to powinien byc like, ale poprawny like...
  1. pole LIKE '%szukana fraza%'

I sobie dostosuj. Jakbys mial problemy to tu masz linka, ktorego dokladna analiza powinna ci pomoc:
http://pl.php.net/manual/pl/language.types.string.php
kononowicz
nie mogęsobie poradzić.. jak wstawić % miedzy $towary?questionmark.gif?

  1. <?php
  2. if(isset($_POST['znajdz']))
  3. {
  4. $towary = $_POST['towary'];
  5. $kod = $_POST['kod'];
  6.  
  7. $wh = array();
  8. if (!empty($_POST['cena_od']))
  9.  $wh[] = 'CENA >= '.$_POST['cena_od'];
  10. if (!empty($_POST['cena_do']))
  11.  $wh[] = 'CENA <= '.$_POST['cena_do'];
  12. if (!empty($_POST['towary']))
  13.  $wh[] = 'TOWARY LIKE '.$towary;
  14. if (!empty($_POST['kod']))
  15.  $wh[] = 'KOD LIKE '.$kod;
  16. ?>
nospor
no ale przeciez to jest banalnie proste. poto dostales linka...
  1. <?php
  2. $wh[] = "TOWARY LIKE '%$towary%'";
  3. ?>

podobnie zrob z KODEM
kononowicz
Cytat(nospor @ 4.12.2006, 15:41:51 ) *
no ale przeciez to jest banalnie proste. poto dostales linka...
  1. <?php
  2. $wh[] = "TOWARY LIKE '%$towary%'";
  3. ?>

podobnie zrob z KODEM


działa .. dziekuje bardzo...
nospor
wyswietl sobie stworzone zapytanie:
  1. <?php
  2. echo $zapytanie;
  3. ?>

Wstaw to co dostaniesz do PMA, czy tez innego klienta MYSQL jesli uzywasz i sprawdź czy oby poprawne masz warunki, czy dane ci sie zgadzaja, czy co kolwiek ci sie zgadza.
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-2024 Invision Power Services, Inc.