Kawałek Kodu

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:

  1. COALESCE(null,'') daje ''
  2. 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