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