Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php/mysql] problem z wyszukiwaniem
guilty82
post 26.04.2007, 16:32:34
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 31
Dołączył: 26.03.2007

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


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

Ten post edytował guilty82 26.04.2007, 16:38:31
Go to the top of the page
+Quote Post
dawhol
post 26.04.2007, 20:03:50
Post #2





Grupa: Zarejestrowani
Postów: 256
Pomógł: 0
Dołączył: 19.07.2006
Skąd: Ostrów Wielkopolski

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


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

Ten post edytował dawhol 26.04.2007, 20:12:50


--------------------
Go to the top of the page
+Quote Post
guilty82
post 27.04.2007, 17:18:39
Post #3





Grupa: Zarejestrowani
Postów: 176
Pomógł: 31
Dołączył: 26.03.2007

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


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
Go to the top of the page
+Quote Post
=kokos=
post 27.04.2007, 18:54:14
Post #4





Grupa: Zarejestrowani
Postów: 114
Pomógł: 0
Dołączył: 6.08.2006

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


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. ?>


Ten post edytował =kokos= 27.04.2007, 18:58:22


--------------------
Początkujący
Go to the top of the page
+Quote Post
guilty82
post 27.04.2007, 19:10:46
Post #5





Grupa: Zarejestrowani
Postów: 176
Pomógł: 31
Dołączył: 26.03.2007

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


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

Ten post edytował guilty82 27.04.2007, 20:08:12
Go to the top of the page
+Quote Post
dawhol
post 27.04.2007, 19:56:06
Post #6





Grupa: Zarejestrowani
Postów: 256
Pomógł: 0
Dołączył: 19.07.2006
Skąd: Ostrów Wielkopolski

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


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. ?>


--------------------
Go to the top of the page
+Quote Post
guilty82
post 27.04.2007, 20:01:23
Post #7





Grupa: Zarejestrowani
Postów: 176
Pomógł: 31
Dołączył: 26.03.2007

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


ale przeciez .= to dołączenie, prawda? Nie rozumiem, w którym miejscu mi kasuje to $where?
Go to the top of the page
+Quote Post
dawhol
post 27.04.2007, 20:05:53
Post #8





Grupa: Zarejestrowani
Postów: 256
Pomógł: 0
Dołączył: 19.07.2006
Skąd: Ostrów Wielkopolski

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


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 ?

Ten post edytował dawhol 27.04.2007, 20:09:07


--------------------
Go to the top of the page
+Quote Post
guilty82
post 27.04.2007, 20:22:19
Post #9





Grupa: Zarejestrowani
Postów: 176
Pomógł: 31
Dołączył: 26.03.2007

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


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
Go to the top of the page
+Quote Post
dawhol
post 27.04.2007, 20:25:06
Post #10





Grupa: Zarejestrowani
Postów: 256
Pomógł: 0
Dołączył: 19.07.2006
Skąd: Ostrów Wielkopolski

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


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

Ten post edytował dawhol 27.04.2007, 20:39:12


--------------------
Go to the top of the page
+Quote Post
guilty82
post 28.04.2007, 11:20:18
Post #11





Grupa: Zarejestrowani
Postów: 176
Pomógł: 31
Dołączył: 26.03.2007

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


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
Go to the top of the page
+Quote Post
dawhol
post 28.04.2007, 17:20:40
Post #12





Grupa: Zarejestrowani
Postów: 256
Pomógł: 0
Dołączył: 19.07.2006
Skąd: Ostrów Wielkopolski

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


a testowałes to na innym serwerz ? bo jak dla mnie to tu błędu niema ;/


--------------------
Go to the top of the page
+Quote Post
kresh
post 28.04.2007, 17:29:46
Post #13





Grupa: Zarejestrowani
Postów: 99
Pomógł: 2
Dołączył: 8.11.2005
Skąd: Kraków

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


  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 ( == )

Ten post edytował kresh 28.04.2007, 17:31:25


--------------------
Programuj pod kątem interfejsu, nie implementacji
Gang of Four

michalbarys.pl
Go to the top of the page
+Quote Post
guilty82
post 28.04.2007, 17:43:06
Post #14





Grupa: Zarejestrowani
Postów: 176
Pomógł: 31
Dołączył: 26.03.2007

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


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!
Go to the top of the page
+Quote Post
dawhol
post 28.04.2007, 20:39:32
Post #15





Grupa: Zarejestrowani
Postów: 256
Pomógł: 0
Dołączył: 19.07.2006
Skąd: Ostrów Wielkopolski

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


... fakt =/ czemu ja tego nie zauwazyłem ? hmmm moze to przez to ze ostatnio siedze troche w TP =/.


--------------------
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: 16.06.2025 - 21:05