Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z selectem
Forum PHP.pl > Forum > PHP
di@blo
mam takie zapytanie

  1. $wykonaj = mysql_query("SELECT * FROM sprzet WHERE (nazwa LIKE '%$nazwa%') AND (opis LIKE '%$opis%') AND (firma LIKE '%$firma%') AND (kolor='$kolor') ");


gdy sie poda w formularzu wszystko tj nazwa, opis, firma, kolor to wszystko dziala ok ale jesli ktores z pol zostaje niewypelnione (a użytkownik musi miec taka mozliwosc) to mimo ze pozostale wartosci znajduja sie w bazie nie zwraca nic Jesli ktos wie jak to rozwiazac to bylbym wdzieczny Interesuja mnie rozwiazana w samym zapytaniu mysql oraz przez php
Fixus
problem zapewne wynika z tego, że kiedy UŻYTKOWNIK (pisownia polska nie jest taka trudna;P ) nie poda jakiejś wartości to zapytanie wyszukuje pól z pustymi ciągami znaków...przez to, że masz wszędzie AND to wygląda na tej zasadzie, że szuka pól gdzie opis czy tam firma jest pustym ciągiem znaków, a takowych nie znajduje bo jak sam napisałeś pozostałe wartości są w tabeli. Dlatego moja rada:
1. albo zamiast AND daj OR wtedy powinno działać
2. albo zrób sprawdzanie tego co jest zaznaczone i konstruuj w locie zapytanie
np:
Kod
$sql = "SELECT * FROM sprzet WHERE ";
if($_POST['nazwa'] != '') {
  $sql .= "nazwa LIKE '%nazwa%' AND";
}
if($_POST['opis'] != '') {
  $sql .= "opis LIKE '%opis%'";
.... // i tak dalej
di@blo
nie jest trudna ale kazdemu sie zdazaja bledy ;p ale nie o tym tutaj Dzieki za rozwiazanie ale nie chodzi o to zeby je skopiowac tylko rozumiec o co chodzi.
W tym rozwiazaniu chodzi o to zeby posklejac zapytanie a pozniej dopiero go uzyc?

  1. $sql = "SELECT * FROM sprzet WHERE ";
  2. IF($_POST['nazwa'] != '') { $sql .= "nazwa LIKE '%nazwa%' AND"; }
  3. IF($_POST['opis'] != '') { $sql .= "opis LIKE '%opis%'"; }
  4.  
  5. mysql_query("$sql");


PS
nie do konca dziala bo jak mam
  1. nazwa LIKE '%nazwa%' AND";

i pozostale zmiene sa puste to przyczepia sie do 'AND' ale pracuje nad tym smile.gif jak by ktos mial proste rozwiazanie to moze sie podzielic bo nie chce za bardzo komplikowac kodu
Fixus
tak chodzi o to żebyś posklejał zapytanie i go potem użył.
Też się kiedyś spotkałem z tym problemem co opisujesz. Możesz to zrobić na dwa sposoby. Jeden jest dość skomplikowany bo wymaga od ciebie szeregu instrukcji warunkowych które uwzględnią wszystkie możliwe przypadki.
drugi sposób jest taki
Kod
...
if($zmienna1 != '') { $sql .= "cos LIKE '%cos%' AND "; }
if($zmienna2 != '') { $sql .= "cos2 LIKE '%cos2%' AND "; }
$sql .= "jakies_pole != ''"; // może tu też być np: $sql .= "jakies_pole LIKE '$''$'";


może to nie jest zbyt eleganckie i nie powinno się tak robić, ale ja tak rozwiązałem ten problem kiedyś przy czymś tam pracując. Ogólnie rzecz polega na tym, że dajesz jakiś absurdalny warunek który będzie spełniony zawsze. Np. pole z identyfikatorem różne od pustego ciągu znaków. W ten sposób zamykasz zapytanie i nie zostaje ci to brzydkie AND na końcu smile.gif wydajności to nie obniża w żaden dostrzegalny dla przeciętnego śmiertelnika sposób. Kodu AŻ tak bardzo nie bruździ a spełnia swoje zadanie smile.gif

mam nadzieje, że nikt się nie zgorszy tym może trochę mało wyrafinowanym sposobem....on po prostu spełnia swoją rolę i nikomu nie wadzi tongue.gif
likemandrake
Zawsze możesz to zrobić tak:

  1. <?php
  2. $sQuery = 'SELECT * FROM tabela';
  3. $aWhereStmt = array();
  4. if($zmienna1) {
  5. $aWhereStmt[] = "warunek1 = '" . mysql_real_escape_string($zmienna1) . "'";
  6. }
  7. if($zmienna2) {
  8. $aWhereStmt[] = "warunek2 = '" . mysql_real_escape_string($zmienna2) . "'";
  9. }
  10. if(sizeof($aWhereStmt) > 0) {
  11. $sQuery .= ' WHERE ' . join(' AND ', $aWhereStmt);
  12. }
  13. $sQuery .= ';';
  14. ?>


Cytat(di@blo @ 2.09.2008, 20:35:45 ) *
nie do konca dziala bo jak mam
  1. nazwa LIKE '%nazwa%' AND";

i pozostale zmiene sa puste to przyczepia sie do 'AND'


Najszybszy sposób na pozbycie się tego 'AND' w zlepionym zapytaniu, to skorzystanie z funkcji substr(). Można to zrobić tak:

  1. <?php
  2. $sQuery = substr($sQuery, 0, -4);
  3. ?>


Ten skrawek kodu wykonujesz, gdy zapytanie jest już praktycznie gotowe smile.gif
di@blo
dzieki za pomoc smile.gif myslalem nad rozwiazaniami ale za bardzo komplikowaly kod

  1. $sQuery = substr($sQuery, 0, -4);


to w zupełności mi wystarczy smile.gif
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.