Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Jeszcze raz wyszukiwanie z formularza metoda GET
Forum PHP.pl > Forum > Przedszkole
aMilk
Witam serdecznie,

postanowilem tutaj napisac, moze pomozecie mi dojsc do tego jak zrobic wyszukiwanie, ktore mnie interesuje.

Formularz: Mam tu pole select z location, pole input z min i max price oraz 4 checkboxy z wyborem 1,2,3,4+, ktory wyslam za pomoca $GET


Nastepnie w odbiorze, wyszukiwanie oparlem o ten przyklad:

  1.  
  2. $wh = array(); //inicjalizujemy tablice z warunkami
  3. if (!empty($_GET['location'])) //jesli podano lokacje
  4. $wh[] = "location = '$_GET[location]' ";
  5.  
  6. if (!empty($_GET['minprice'])) //cena - jesli podano zakres dolny
  7. $wh[] = "price >= '$_GET[minprice]' ";
  8.  
  9. if (!empty($_GET['maxprice'])) //cena - jesli podano zakres gorny
  10. $wh[] = "price <= $_GET[maxprice]";
  11.  
  12. if (!empty($_GET['bedroom'])) //jesli podano ile pokoi | 1 lub 2 lub 3
  13. $wh[] = "bedroom = $_GET[bedroom]";
  14.  
  15. if (!empty($_GET['bedroommore'])) //jesli pokoi 4 lub wiecej
  16. $wh[] = "bedroom >= $_GET[bedroommore]";
  17.  
  18. if (!empty($wh))
  19. $where = 'where '.implode(' and ', $wh);
  20. else
  21. $where = '';
  22.  
  23. //a teraz tworzymy nasze glowne zapytanie i laczymy je z naszymi warunkami
  24. $sql = 'select * from properties '.$where;
  25. $result = mysql_query($sql,$link);
  26.  


Sek w tym, ze ten skrypt oparty jest na 'AND' co widac przy implode , a ja chcialbym aby pole select i input bylo sprawdzane jako AND ale kazdy checkbox jako OR i nie mam pojecia jak to zmodyfikowac.

Takze wszystko jest ok jesli nie wybiore ilosc bedroom. W przypadku kiedy zaznacze 2 checkboxy skrypt sprawdza czy w danej lokalizacji mamy 1 i 2 zamiast czy mamy 1 lub 2.

Ma ktos jakis pomysl jak to przerobic?

RiE
A probowałeś zrobić cos takiego:
  1. if (!empty($_GET['bedroom'])) /
  2. $wh_2[] = "bedroom = $_GET[bedroom]";
  3. if (!empty($_GET['bedroommore']))
  4. $wh_2[] = "bedroom >= $_GET[bedroommore]";


  1. if (!empty($wh)){
  2. $where = 'where '.implode(' and ', $wh);
  3. $where_2 = implode('or',$wh_2);
  4. $where="$where $where_2";
  5. else{
  6. $where = '';
  7. }
aMilk
Czesc,

dzieki za podpowiedz. Niestety nie dziala.

Warning: implode() [function.implode]: Invalid arguments passed i podaje wyniki ale nie zgodne z prawda.

Brakowalo tam klamry do zamkniecia w Twoim przykladzie oraz 'or' na wszelki wypadek zapisalem ' or ' (ze spacjami).

Niestety to samo.

Czy moglbym uzyskac dodatkowa pomoc ?
RiE
  1. if (!empty($wh)){
  2. $where = 'where '.implode(' and ', $wh);
  3. $where_2 = implode(' or ',$wh_2);
  4. $where="$where and $where_2";
  5. }
  6. else{
  7. $where = '';
  8. }


Teraz powinno byc ok
aMilk
Kazdy checbutton name mialem bedroom wiec w tym wypadku wyniki mi sie zastepowaly i otrzymywalem tylko ostatni.

Zmienilem zatem name kazdego checkbutton oraz dodalem w odbiorze zmenione GET.

if (!empty($_GET['bedroom1']))
$wh_2[] = "bedroom = $_GET[bedroom1]";

if (!empty($_GET['bedroom2']))
$wh_2[] = "bedroom = $_GET[bedroom2]";

if (!empty($_GET['bedroom3']))
$wh_2[] = "bedroom = $_GET[bedroom3]";

Niestety nie dziala, w tym przypadku jesli nie zaznacze bedroom wogole jest blad:

Warning: implode() [function.implode]: Bad arguments.
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in


Jesli zaznacze w danej lokacji bedroom1 i bedroom3 - bo JA wiem ze sa w danej lokacji - wyswietlaja sie - super - dziala.

Jesli zaznacze w danej lokacji bedroom1 i bedroom2 i bedroom3 - wyswietla mi rowniez lokacje ktorej nie szukalem. Bedroom2 w tym wypadku nie ma w tej lokacji ktorej szukam.

Sam nie wiem juz co z tym zrobic. Twoj pomysl wydaje sie naprawde dobry, tylko a) jak zrobic warunek by w przypadku (braku wyboru) bedroom wyswietlal wszystkie z tej lokacji
cool.gif dlaczego szuka w innych rekordach rowniez.

Jakis pomysl RiE ?

nospor
pokaz caly kod
aMilk
Prosze bardzo.

Caly kod formularza + odbieranie.

formularz.php - wycialem divy i zotawilem sam formularz zeby bylo czysciej.


  1. <form action="search.php" method="GET">
  2.  
  3. <SELECT NAME="location">
  4. <?PHP
  5. $sql = "Select DISTINCT location from properties;";
  6. $result = mysql_query($sql,$link);
  7.  
  8. while(($row=mysql_fetch_array($result))!=NULL){
  9. echo '<OPTION VALUE="'.$row['location'].'">'.$row['location'].'</option>';
  10. }
  11. ?>
  12. </SELECT>
  13.  
  14. <input id="price" name="minprice" style="width:35px; margin-top: 2px;"/>
  15. <input id="price" name="maxprice" style="width:35px; margin-top: 2px;"/>
  16.  
  17.  
  18. <label>&nbsp;&nbsp;No. of bed</label><br />
  19. <input type="checkbox" name="bedroom1" id="bedroom" value="1" />1</input>
  20. <input type="checkbox" name="bedroom2" id="bedroom" value="2" />2</input>
  21. <input type="checkbox" name="bedroom3" id="bedroom" value="3" />3</input>
  22. <input type="checkbox" name="bedroommore" id="bedroom" value="4" />4+</input>
  23.  
  24. <input type="submit" style="width:61px; height:30px;" value="" class="searchbutton" />
  25. </form>



odbieram w search.php

  1. $wh = array(); //inicjalizujemy tablice z warunkami
  2.  
  3. if (!empty($_GET['location'])) //jesli podano lokacje
  4. $wh[] = "location = '$_GET[location]' ";
  5.  
  6. if (!empty($_GET['minprice'])) //jesli podano zakres dolny
  7. $wh[] = "price >= '$_GET[minprice]' ";
  8.  
  9. if (!empty($_GET['maxprice'])) //jesli podano zakres dolny
  10. $wh[] = "price <= $_GET[maxprice]";
  11.  
  12.  
  13. if (!empty($_GET['bedroom1']))
  14. $wh_2[] = "bedroom = $_GET[bedroom1]";
  15.  
  16. if (!empty($_GET['bedroom2']))
  17. $wh_2[] = "bedroom = $_GET[bedroom2]";
  18.  
  19. if (!empty($_GET['bedroom3']))
  20. $wh_2[] = "bedroom = $_GET[bedroom3]";
  21.  
  22. if (!empty($_GET['bedroommore']))
  23. $wh_2[] = "bedroom >= $_GET[bedroommore]";
  24.  
  25.  
  26. if (!empty($wh)){
  27. $where = 'where '.implode(' and ', $wh);
  28. $where_2 = implode(' or ', $wh_2);
  29. $where = "$where and $where_2";
  30. }
  31. else{
  32. $where = 'pusto';
  33. }
  34.  
  35.  
  36. $sql = 'select * from properties '.$where;
  37. $result = mysql_query($sql,$link);
  38.  
  39. while(($row=mysql_fetch_array($result))!=NULL){
  40.  
  41. echo ''.$row['location'].'';
  42. echo '<br />';
  43. echo ''.$row['price'].'';
  44. echo '<br />';
  45. echo ''.$row['bedroom'].'';
  46. echo '<br />';
  47.  
RiE
To powinno pomoc smile.gif
  1. if (!empty($wh)){
  2. $where = 'where '.implode(' and ', $wh);
  3. if($_GET['bedroom1'] == NULL && $_GET['bedroom2'] == NULL && $_GET['bedroom3'] == NULL){
  4. $wh_2[]='bedroom >= 1';
  5. $where_2='';
  6. }
  7. else{
  8. $where_2 = implode(' or ',$wh_2);
  9. }
  10. $where="( $where ) and ( $where_2 )";
  11. }
  12. else{
  13. $where = '';
  14. }
aMilk
RiE podziwiam Cie, bo ja juz ledwo co widze w tym kodzie ;-)

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource

obojetnie czy zaznacze bedroom czy nie... sadsmiley02.gif
nospor
  1. $wh = array(); //inicjalizujemy tablice z warunkami
  2.  
  3. if (!empty($_GET['location'])) //jesli podano lokacje
  4. $wh[] = "location = '$_GET[location]' ";
  5.  
  6. if (!empty($_GET['minprice'])) //jesli podano zakres dolny
  7. $wh[] = "price >= '$_GET[minprice]' ";
  8.  
  9. if (!empty($_GET['maxprice'])) //jesli podano zakres dolny
  10. $wh[] = "price <= $_GET[maxprice]";
  11.  
  12. $wh_2 = array();
  13. if (!empty($_GET['bedroom1']))
  14. $wh_2[] = "bedroom = $_GET[bedroom1]";
  15.  
  16. if (!empty($_GET['bedroom2']))
  17. $wh_2[] = "bedroom = $_GET[bedroom2]";
  18.  
  19. if (!empty($_GET['bedroom3']))
  20. $wh_2[] = "bedroom = $_GET[bedroom3]";
  21.  
  22. if (!empty($_GET['bedroommore']))
  23. $wh_2[] = "bedroom >= $_GET[bedroommore]";
  24.  
  25. $wh3 = array();
  26.  
  27. if (!empty($wh))
  28. $wh3[] = implode(' and ', $wh);
  29. if (!empty($wh_2))
  30. $wh3[] = '('.implode(' or ', $wh_2).')';
  31.  
  32. if (!empty($wh3))
  33. $where = implode(' and ', $wh3);
  34. else
  35. $where = '';
  36.  
  37.  
  38. $sql = 'select * from properties '.$where;
  39. $result = mysql_query($sql,$link);
  40.  
  41. while(($row=mysql_fetch_array($result))!=NULL){
  42.  
  43. echo ''.$row['location'].'';
  44. echo '<br />';
  45. echo ''.$row['price'].'';
  46. echo '<br />';
  47. echo ''.$row['bedroom'].'';
  48. echo '<br />';
  49. }
aMilk
Dzieki nospor ale ten sam efekt

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource

obojetnie czy zaznacze bedroom czy nie...

skopiowalem caly kod na wszelki wypadek i to samo.
nospor
  1. //....
  2. $result = mysql_query($sql,$link) or die('zapytanie:'.$sql.' blad:'.mysql_error());
aMilk
zapytanie:select * from properties location = 'Lokacja' blad: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 '= 'Lokacja'' at line 1
nospor
oj... zapomnialem o WHERE winksmiley.jpg
  1. if (!empty($wh3))
  2. $where = ' where '.implode(' and ', $wh3);
  3. else
  4. $where = '';
thek
A ja Ci zadam pytanie. Po co masz sprawdzać czy któryś z checkboxów jest zaznaczony i wykluczać inne? Z tego co piszesz wynika, że wybranie któregokolwiek powinno negować pozostałe a więc nie checkbox tam powinien być ale kontrolka typu radio... I od tego bym chyba zaczął winksmiley.jpg
nospor
@thek a gdzieś ty wyczytał ze negują? ja czytam i czytam i nie widzę
aMilk
@nospor - probuje znalezc blad i nie moge... dziala ! To naprawde dziala! Wow!

Jestem zobowiazany za ta pomoc...

Nie wiem jeszcze jak zwrocic komunikat, ktory poinformuje mnie ze nic nie znaleziono, w tej chwili mam bialy ekran.

Czy moglbym jeszcze prosic o ten dodatek ? (wiem ze i tak juz nadwyrezylem pomoc)

RiE
  1. $ilosc=mysql_num_rows($result);
  2. if($ilosc == 0){
  3. echo 'Nic nie znaleziono';
  4. }else{
  5. while(($row=mysql_fetch_array($result))!=NULL){
  6. echo ''.$row['location'].'';
  7. echo '<br />';
  8. echo ''.$row['price'].'';
  9. echo '<br />';
  10. echo ''.$row['bedroom'].'';
  11. echo '<br />';
  12. }
  13. }
aMilk
Dzieki RiE za zwracanie informacji - dziala.

Pieknie Wam dziekuje.
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.