Czasem masz dobry humor, a czasem zły. W obydwu przypadkach możesz zostać w domu.
Czasem do Twojego zapytania dociera wartość wykorzystywana w klauzuli WHERE, a czasem jej kompletnie brak.
Czy w tym przypadku możesz używać stałej składni zapytania bez potrzeby jej modyfikowania w zależności od istnienia tejże wartości?
Pewnie przyzwyczajony miłymi niespodziankami na tym blogu narzuca Ci się w tym momencie odpowiedź: "tak". Ależ oczywiście, i tym razem nie pomyliłeś się!
Pokażę Ci jak to zrobić z wykorzystaniem biblioteki PDO. Za przykład posłuży zapytanie wybierające miasta z danego województwa lub też z wszystkich województw. Załóżmy, że to po prostu jakiś formularz kryteriów, np. wyszukiwarka. Z pierwszą sytuacją będziemy mieć do czynienia kiedy użytkownik wybierze z listy województw jakąś wartość, a z drugą, kiedy... nie wybierze.
$sql = "SELECT miasto
FROM miasto
WHERE IF(COALESCE(:id_wojewodztwo,'')='', true, id_wojewodztwo=:id_wojewodztwo)
";
$stmt = $mysql->prepare($sql);
$stmt->bindValue(':id_wojewodztwo', empty($_POST['id_wojewodztwo']) ? null : $_POST['id_wojewodztwo']);
$stmt->execute();
$miasta= $stmt->fetchAll();
Nas interesuje fragment:
IF(COALESCE(:id_wojewodztwo,'')='', true, id_wojewodztwo=:id_wojewodztwo)
Jeśli przypniemy do parametru :id_wojewodztwo wartość null, to zostanie zwrócona pierwsza wartość instrukcji IF (value_if_true), bo:
- COALESCE(null,'') daje ''
- a więc: ''=''
Zapytanie uprościć wtedy można do:
SELECT miasto FROM miasto WHERE true
i co się sprowadza po prostu do:
SELECT miasto FROM miasto
Jeśli natomiast jako wartość parametru :id_wojewodztwo przypniemy np. 1, to warunek instrukcji IF nie będzie spełniony, a więc do klauzli WHERE będzie podstawiona wartość id_wojedztwo=1 (value_if_false).
Czyli zapytanie możemy uprościć do:
SELECT miasto FROM miasto WHERE id_wojewodztwo=1
Dopóki będziesz podstawiał niepustą wartość id_wojewodztwo, otrzymasz takie rekordy (miejscowości), które spełniają tenże warunek. A kiedy przekażesz wartość pustą (brak wyboru województwa), otrzymasz wszystkie miejscowości.
Cieszę się, że dzisiejszy post będzie miał dla Ciebie nieporównywalną z niczym wartość, a pustka dotycząca rozwiązania problemu zniknie.
Przydatne linki:
Funkcja COALESCE
Funkcja IF