Papuga
28.03.2011, 17:09:39
Witam,
mam kłopot. Mój mało kreatywny mózg nie może znaleźć sposobu na pewien problem.
Otóż. Mam formularz składający się z 6 pól.
1. marka samochodu
2. model
3. wersja
4. nadwozie
5. liczba drzwi
6. silnik
wysyłam je metodą post.
W PHP łączę się z bazą i mam zapytanie, które wyświetla mi wyniki.
Nie wiem co wpisać w zapytaniu SQL zaraz po WHERE. Użytkownik może wypełnić każde pole, a może i żadne.
Jak rozwiązać ten problem, że gdy użytkownik wpisze tylko model to mu będzie sortowało przez model, etc.
Proszę o pilną pomoc.
Z góry dziękuję za wszystkie odpowiedzi.
Pozdrawiam,
Paweł.
cycofiasz
28.03.2011, 17:20:26
Zależnie od tego jakie pola wypełni, doklejasz kolejne warunki w zapytaniu. Warunki łączysz poprzez AND i to tyle.
Np. SELECT * FROM tabela WHERE nadwozie = $nadwozie AND silnik = 1600
Papuga
28.03.2011, 17:22:18
To nie takie łatwe.
Tak już robiłem, ale wyskakuje błąd zapytania...
cycofiasz
28.03.2011, 17:23:47
No to widocznie robisz to źle bo sam sposób jest poprawny.
Kedan
28.03.2011, 17:25:01
Tak z pamięci:
$query = 'SELECT ... FROM ....';
if(!empty($_POST['model'])) { $query .= ' WHERE `model`='.$_POST['model'];
}
$query .= ' AND ';
// etc...
albo w pętli:
$first = TRUE;
foreach($_POST as $name=>$value) {
if(!$first) $query .= ' AND ';
$query .= ' WHERE '.$name.'='.$value;
$first = FALSE;
}
}
Papuga
28.03.2011, 17:27:21
Możesz rzucić okiem na ten fragment kodu?
Kod
$marka = $_POST['marka']";
$model = $_POST['model']";
$wersja = $_POST['wersja'];
$nadwozie = $_POST['nadwozie'];
$drzwi = $_POST['drzwi'];
$silnik = $_POST['silnik'];
$zapytanie = @mysql_query("SELECT * FROM cars WHERE marka='$marka' AND model='$model' ") or die ("Błąd w zapytaniu.");
Jeżeli marka jest tylko uzupełniona a model nie wyskakuje błąd...
Kedan
28.03.2011, 17:39:50
Musisz sprawdzać czy dane pole $_POST jest w ogóle zdefiniowane. Jak nie jest to w zapytaniu wyjdzie przecież WHERE model=NULL
$zapytanie = 'SELECT * FROM cars';
if(!empty($_POST['marka'])) { $zapytanie .= ' WHERE marka='.$_POST['marka'];
}
if(!empty($_POST['model'])) { $zapytanie .= ' AND WHERE model='.$_POST['model'];
}
// ....i tak dalej z pozostałymi polami _POST
}
Pokombinuj. Zwracaj uwagę na spacje w zapytaniu.
Papuga
28.03.2011, 17:56:10
Już jestem bliżej. Trochę mi oświeciłeś drogę, ale co jeśli nie będzie podana marka?
Zapytanie będzie wyglądało: SELECT * FROM cars AND WHERE ...
Jak to obejść?
melkorm
28.03.2011, 18:44:53
if(isset($_POST['marka']) && !empty($_POST['marka'])) { $where[] = ' marka = '.$_POST['marka'];
}
if(isset($_POST['mdoel']) && !empty($_POST['model'])) { $where[] = ' model = '.$_POST['mdoel'];
}
// ....i tak dalej z pozostałymi polami _POST
$zapytanie = 'SELECT * FROM cars WHERE '.implode(' AND ',$where); }
else
{
$zapytanie = 'SELECT * FROM cars';
}
$result = mysql_query($zapytanie) or
die('Error'); // wystrzegamy się małpek w ZOO }
P.S. Filtrację danych zostawiam Tobie.