Kawałek Kodu

Jesteśmy w profilu użytkownika. Ten może zmienić hasło. Jeśli pole zostawi puste, nie chcemy oczywiście zapisywać w bazie danych hasła pustego (hash pustego!), lecz pozostawić aktualne. Czyli chcemy jednym zapytaniem zaktualizować część danych, a część pozostawić bez zmian.

You can't have your cake and eat it...

Niestety, ale w dzisiejszym, krótkim wpisie to powiedzenie straci sens istnienia. Załóżmy, że nasza tabela uzytkownik zawiera następujące pola: id_uzytkownik, login, haslo. Nie będziemy wnikać w walidację danych po stronie formularza, ani po stronie serwera. Mamy już dane do aktualizacji. Albo...ich nie mamy.

Standardowo zapytanie przy poprawnej wartości loginu i braku hasła będzie wyglądać tak:

UPDATE uzytkownik SET login=:login WHERE id_uzytkownik=:id_uzytkownik

Jeśli mamy hasło:

UPDATE uzytkownik SET login=:login, haslo=:haslo WHERE id_uzytkownik=:id_uzytkownik

W zależności od istnienia danych mamy różne składnie zapytania.

You can have your cake and eat it!

Możemy w prosty sposób stworzyć jedno zapytanie, które pozwoli nam zapisać wartości, które mamy, a pozostawić wartości, których nam w danej chwili brak.

UPDATE uzytkownik SET login=:login, haslo=COALESCE(:haslo, haslo) WHERE id_uzytkownik=:id_uzytkownik

Jak to działa? Jeśli :haslo ma wartość NULL (taką musimy podpiąć w przypadku sytuacji kiedy nie chcemy aktualizować hasła), to funkcja COALESCE podstawi nam drugi argument, więc fragment uprości się do:

haslo=haslo

Jeśli :haslo ma konkretną wartość (hash hasła) i chcemy aktualizować, wtedy fragment przybierze postać:

haslo=:haslo