Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/mysql] problem z wyszukiwaniem
Forum PHP.pl > Forum > Przedszkole
guilty82
Witam,

Może zacznę od kodu.
Mój fomularz wygląda tak:

  1. <form action="wyszukaj.php" method="get" name="wyszukaj" id="wyszukaj">
  2. <pre><select name="p_uzyt" id="pow"><option selected value="*">powierzchnia</option>
  3. <option value="">------------------------</option>
  4. <option value="1">do 80m2</option>
  5. <option value="2">80 do 120m2</option>
  6. <option value="3">powyżej 120m2</option>
  7. </select>
  8. </pre>
  9. <pre><select name="tech"><option selected value="*">technologia</option>
  10. <option value="">------------------------</option>
  11. <option value="murowany">murowany</option>
  12. <option value="szkieletowy">szkieletowy</option>
  13. </select>
  14. </pre>
  15. <pre><select name="kat"><option selected value="*">kategoria</option>
  16. <option value="">------------------------</option>
  17. <option value="parter">parterowy</option>
  18. <option value="male_poddasze">małe poddasze</option>
  19. <option value="poddasze">poddasze</option>
  20. </select>
  21.  
  22. <input name="szukaj" type="submit" id="wyszukaj" value="szukaj">
  23. </pre>
  24. </form>


Zapytanie tak:
  1. <?php 
  2. $p_uzyt = $_GET['p_uzyt'];
  3. $tech = $_GET['tech'];
  4. $kat = $_GET['kat'];
  5.  
  6. $lista = @mysql_query("SELECT * FROM domki
  7. WHERE p_uzytkowa='$p_uzyt' OR technologia='$tech'
  8. OR kategoria='$kat' ORDER BY p_uzytkowa");
  9. ?>


Ok. Mój problem dotyczy zmiennej $p_uzyt. Nie wiem jak zdefiniować dla niej wartość żeby zapytanie filtrowało pozycje które spełniają warunek. W bazie mam pozycje p_uzytkowa od 0.00 do 200.00 i przykładowo wybieram opcję <option value="2">80 do 120m2</option>. probowałem z IF, ale nie działa:
  1. <?php
  2. $p_uzyt = $_GET['p_uzyt'];
  3. if ($p_uzyt == 1) {
  4. $p_uzyt = $p_u < 80.00; }
  5. if ($p_uzyt == 2) {
  6. $p_uzyt = ($p_u > 80.00) and ($p_u < 120.00); }
  7. if ($p_uzyt == 3) {
  8. $p_uzyt = $p_u > 120.00; }
  9. ?>


--edit--
ok $p_u nie ma przypisanej wartości. teraz zauważyłem ten błąd. Jednak nadal się zastanawiam jak przekształcić tego IFa, żeby w zapytaniu wybrał tylko te pozycje, których p_uzytkowa = od 80 do 120
--edit--

Drugi problem to, że jak nie zaznacze żadnej opcji z forma to chciałbym aby z bazy zostały wyciągnięte wszystkie wartości. Próbowałem wstawić '*' jako default value:
  1. <option selected value="*">powierzchnia</option>

Jednak mysql chyba ignoruje "gwiazdki" przesyłane przez GET.
Proszę o pomoc
dawhol
Co do pierwszego to warunek IF wydaje sie byc OK
a co do drugiego to nie * tylko % (dowolna ilosc znaków) co najwyzej winksmiley.jpg lub _(jeden znak)

Polecam rozwiązanie no-spora (mam nadzieje ze nie przekręciłem nicka)
  1. <?php
  2. $wh = array();
  3. if (isset($nazwa))
  4.  $wh[] = 'nazwa LIKE "'.$nazwa.'%"';
  5. if (isset($miasto) && $miasto != '')
  6.  $wh[] = 'miasto LIKE "'.$miasto.'%"';
  7.  if (isset($gwiazdki) && $gwiazdki != '*')
  8.  $wh[] = 'gwiazdki="'.$gwiazdki.'"';
  9.  if (isset($kat) && $kat != '0')
  10.  $wh[] = 'kategoria="'.$kat.'"';
  11.  if (isset($woj) && $woj != '*') // nie sugeruj sie tymi gwiazdakami u mnie w skrypcie oznaczaja cos innego ;) 
  12.  $wh[] = 'wojewodztwo="'.$woj.'"';
  13.  if (isset($wyposazenie) && $wyposazenie != '')
  14.  $wh[] = 'wyposazenie LIKE "'.$wyposazenie.'"';
  15.  
  16.  
  17. if (isset($wh)) {$where = implode(' AND ', $wh);} else {$where = 'id="%"';} ; // tu masz to o co pytałes powinno dac wszystkie wyniki z bazy
  18.  
  19. $sql = 'SELECT * FROM hotel WHERE '.$where;
  20. ....
  21. ?>


Moze jeszcze troche wytłumaczenia winksmiley.jpg
a wiec tam gdzie masz like $zmienna."%" to poptrostu w bazie szuka gdzie jakas wartosc pola ma dane ze zmiennej zmienna w sobie i ew. po nich jakies inne znaki ze jak np w wyszukiwarce wpisze samą litere K to pokaze Ci wyniki z bazy które zaczynaja sie na litere K jak np DŻE to pokaze Ci wszystko co zaczyna sie na DŻE ... itd a tam gdzie masz zmienna=$zmienna to poprostu "stała" wartość z formularza np z pól option smile.gif
guilty82
Uproszczę troche moje pytanie bo chyba sie nie zrozumieliśmy..

Mam 2 wartosci przesyłane metoda GET. Wszystko działa dopóki obie mają jakąś wartość. Jeśli zaś nie wybiorę żadnej albo tylko jedną a druga będzie pusta nie wyświetli mi wyniku sad.gif

Oto mój kod:
  1. <?php
  2. $tech = $_GET['tech'];
  3. $kat = $_GET['kat'];
  4.  
  5. $lista = @mysql_query("SELECT * FROM domki
  6. WHERE technologia='$tech' AND kategoria='$kat'
  7. ORDER BY p_uzytkowa");
  8.  
  9. ?>


Jak zrobić żeby wyświetlał wszystko gdy $_GET bedzie przesylal '' (pusta wartosc)?

Próbowałem różnych metod z IF ale wszystkie zawiodły
=kokos=
spróbuj tak

  1. <?php
  2. $tech = $_GET['tech'];
  3. $kat = $_GET['kat'];
  4.  
  5. if(empty($_GET['tech']) {
  6.  
  7. $lista = @mysql_query("SELECT * FROM domki
  8. WHERE kategoria='$kat'
  9. ORDER BY p_uzytkowa");
  10.  
  11. } elseif(empty($_GET['kat'])) {
  12.  
  13. $lista = @mysql_query("SELECT * FROM domki
  14. WHERE technologia='$tech'
  15. ORDER BY p_uzytkowa");
  16.  
  17. } elseif(!empty($_GET['kat']) && !empty($_GET['tech'])) {
  18.  
  19. $lista = @mysql_query("SELECT * FROM domki
  20. WHERE technologia='$tech' AND kategoria='$kat'
  21. ORDER BY p_uzytkowa");
  22. } else {
  23.  
  24. $lista = @mysql_query("SELECT * FROM domki ORDER BY p_uzytkowa");
  25.  
  26. }
  27. ?>
guilty82
Wielkie dzięki!

ps. Próbowałem podobnie z tym że stosowałem dla każdej opcji osobn IF. Ale niestety moje nie działało

--edit--

hmm niestety jesli nic nie wybiore to nic mi nie wyswietli sad.gif a chcialbym zeby bylo tak, że jesli nic nie wybiore to wyswietli wszystko z bazy... dlatego wzialem sie za inna metode. Oto moj kod:

  1. <?php
  2. $select = 'SELECT * FROM domki';
  3. $where = ' WHERE 1=1';
  4. $order = ' ORDER BY p_uzytkowa';
  5.  
  6. $p_uzyt = $_GET['p_uzyt'];
  7. if ($p_uzyt = '1') {
  8. $where .= " AND p_uzytkowa<'80.00'";
  9. } elseif ($p_uzyt = '2') {
  10. $where .= " AND p_uzytkowa>'80.00' AND p_uzytkowa<120.00";
  11. } elseif ($p_uzyt = '3') {
  12. $where .= " AND p_uzytkowa>'120.00'";
  13. } elseif ($p_uzyt = '') {
  14. $where .= " AND p_uzytkowa>'1.00' AND p_uzytkowa<999.00";
  15. }
  16.  
  17. $tech = $_GET['tech'];
  18. if ($tech != '') {
  19. $where .= " AND technologia='$tech'";
  20. }
  21.  
  22. $kat = $_GET['kat'];
  23. if ($kat != '') {
  24. $where .= " AND kategoria='$kat'";
  25. }
  26.  
  27. $lista = @mysql_query($select . $where . $order);
  28. ?>


I teraz niby działa, ale co bym nie wybral to wyswietla tylko wynik spelniajacy p_uzytkowa<80.00 sad.gif
Czy ktos wie moze w czym problem? Dzieki
dawhol
najpierw zmiennej where przypisałes jeden warunek a pozniej drugi a więc pierwszy został skasowany jak juz to w drugim daj
  1. <?php
  2. $where = $where." AND ...";
  3. ?>
guilty82
ale przeciez .= to dołączenie, prawda? Nie rozumiem, w którym miejscu mi kasuje to $where?
dawhol
a tak zgadza się mój bład nie zauwazyłem kropeczki smile.gif . Przyjrze sie jescze raz i wyedutuje posta winksmiley.jpg

zastanawia mnie to
  1. <?php
  2. $where = ' WHERE 1=1';
  3. ?>
bo ogolnie nie widze zadnego bladu
1 to jest nazwa kolumny w bazie czy jak ?
guilty82
Chodzi o to, aby w zależności od ograniczeń podanych w formularzu, można było odpowiednio modyfikować SELECT. Ograniczenia te narzucą konieczność modyfikowania WHERE. Jeśli jednak nie określę żadnych warunków (chcemy żeby pokazało wszystkie wyniki), WHERE nie będzie potrzebne. Ponieważ jednak trudno modyfikować WHERE, które nie istnieje, w takiej sytuacji bedzie potrzebne WHERE które nic nie robi i zawsze jest prawdziwe smile.gif Mam nadzieje, że jasno to wyjaśniłem smile.gif
dawhol
no to teraz czaje ;P ale ehh nie lepiej skorzystac z tego co Ci napisałem kilka postów wczesniej z tej metody NOSPOR-a jest bardzo fajna i elastyczna.

  1. <?php
  2. $where .= " AND p_uzytkowa<120.00"; // wywal pierwsza czesc warunku jak nie jest mniejsze to logincze ze jest wieksze 
    wiec wystarczy druga czesc warunku ze ma byc mniejsze od 120
  3. ?>


ew. sprawdz jak to zadziala zamiast if -> swich
guilty82
Nie bardzo wiem jak ten kod dostosować do swojego sad.gif

Mam teraz tak:
  1. <?php
  2. $select = 'SELECT * FROM domki';
  3. $where = ' WHERE 1=1';
  4. $order = ' ORDER BY p_uzytkowa';
  5.  
  6. $p_uzyt = $_POST['p_uzyt'];
  7. if (!$p_uzyt) {
  8. $where .= " AND p_uzytkowa>'1.00' AND p_uzytkowa<'999.00'";
  9. } elseif ($p_uzyt = 'a') {
  10. $where .= " AND p_uzytkowa<'80.00'";
  11. } elseif ($p_uzyt = 'b') {
  12. $where .= " AND p_uzytkowa>'80.00' AND p_uzytkowa<'120.00'";
  13. } elseif ($p_uzyt = 'c') {
  14. $where .= " AND p_uzytkowa>'120.00'";
  15. }
  16.  
  17. $tech = $_POST['tech'];
  18. if ($tech != '') {
  19. $where .= " AND technologia='$tech'";
  20. }
  21.  
  22. $kat = $_POST['kat'];
  23. if ($kat != '') {
  24. $where .= " AND kategoria='$kat'";
  25. }
  26.  
  27. $lista = @mysql_query($select . $where . $order);
  28. ?>


Super wszystko chodzi, oprócz $p_uzyt. Gdy $p_uzyt jest puste wyświetla wszystkie wyniki, czyli dobrze. Gdy jednak pobiera z POST wartosci 'a', 'b' lub 'c' działa tylko według kryteriów dla 'a' sad.gif
dawhol
a testowałes to na innym serwerz ? bo jak dla mnie to tu błędu niema ;/
kresh
  1. <?php
  2. } elseif ($p_uzyt == 'a') {
  3. $where .= " AND p_uzytkowa<'80.00'";
  4. } elseif ($p_uzyt == 'b') {
  5. $where .= " AND p_uzytkowa>'80.00' AND p_uzytkowa<'120.00'";
  6. } elseif ($p_uzyt == 'c') {
  7. $where .= " AND p_uzytkowa>'120.00'";
  8. }
  9. ?>


operatory porównania się kłaniają winksmiley.jpg
operator porównania ( == )
guilty82
No nie... to ja się chwytam jakichś klas i innych dzikich węży a tu taka podstawa smile.gif Myślę, że jeszcze troche posiedze w przedszkolu winksmiley.jpg Dzieki kreshu!
dawhol
... fakt =/ czemu ja tego nie zauwazyłem ? hmmm moze to przez to ze ostatnio siedze troche w TP =/.
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.