W jaki sposób, stosując język PHP, zapisać w ciasteczku napis znajdujący się w zmiennej dane na czas jednego dnia?
A.
setcookie("dane", $dane, time());
B.
setcookie("dane", $dane, 0);
C.
setcookie("dane", "dane", 0);
D.
setcookie("dane", $dane, time() + (3600*24));
Pytanie z egzaminu CKE, czerwiec 2021 (arkusz EE.09-SG-21.06).
W PHP funkcja setcookie() przyjmuje jako podstawowe argumenty: nazwę ciasteczka, jego wartość oraz czas wygaśnięcia podany jako znacznik czasu Unix. Dlatego zapis setcookie('dane', $dane, time() + (3600 * 24)); jest właściwy: nazwa ciasteczka to 'dane', wartość pochodzi ze zmiennej $dane, a czas życia wynosi 3600 sekund × 24, czyli dokładnie jedna doba od aktualnego momentu. Funkcja time() zwraca bieżący czas w sekundach od epoki Unix, więc dodanie 86400 sekund ustawia wygaśnięcie na jutro o tej samej porze. W praktyce takie ciasteczko można wykorzystać np. do zapamiętania ustawień użytkownika, wybranego motywu strony albo krótkotrwałej informacji pomocniczej. Moim zdaniem warto od razu pamiętać o dobrej praktyce: setcookie() trzeba wywołać przed wysłaniem jakiejkolwiek treści HTML do przeglądarki, bo ciasteczka są ustawiane w nagłówkach HTTP. W prawdziwych projektach często dodaje się też parametry path, secure, httponly i samesite, szczególnie gdy ciasteczko ma związek z logowaniem albo danymi użytkownika.
Przy ciasteczkach w PHP łatwo pomylić trzy różne rzeczy: nazwę ciasteczka, jego wartość oraz czas wygaśnięcia. Samo użycie time() jako trzeciego argumentu nie oznacza „od teraz przez jakiś czas”, tylko ustawia datę wygaśnięcia na dokładnie aktualny moment. W efekcie przeglądarka może od razu uznać takie ciasteczko za wygasłe albo praktycznie natychmiast je usunąć. To typowy błąd, bo time() wygląda jak „czas teraz”, ale do trwałości ciasteczka trzeba jeszcze dodać odpowiednią liczbę sekund. Dla jednego dnia będzie to 3600 * 24, czyli 86400 sekund. Inny częsty problem to zapisanie tekstu 'dane' zamiast wartości zmiennej $dane. Wtedy w ciasteczku znajdzie się dosłownie napis dane, a nie zawartość zmiennej, którą program wcześniej przygotował. To niby mała różnica w kodzie, ale w aplikacji daje zupełnie inny efekt. Ustawienie czasu na 0 też nie spełnia warunku z pytania, ponieważ takie ciasteczko jest ciasteczkiem sesyjnym i zwykle znika po zamknięciu przeglądarki, a nie po jednym dniu. Z mojego doświadczenia najlepiej zapamiętać zasadę: jeśli ciasteczko ma działać określony czas, trzeci argument powinien być timestampem z przyszłości, np. time() + liczba_sekund. Warto też kojarzyć, że setcookie() działa przez nagłówki HTTP, więc musi być wykonane przed wypisaniem tekstu na stronę, inaczej pojawią się problemy typu „headers already sent”.