Jak, wykorzystując język PHP, zapisać w ciasteczku o nazwie dane wartość zmiennej $dane na okres 30 dni?
A.
setcookie("dane", $dane, time() + 30);
B.
setcookie("dane", $dane, time() + (3600*24*30));
C.
setcookie("dane", "dane", 30);
D.
setcookie("dane", $dane, 30);
Poprawny zapis to setcookie("dane", $dane, time() + (3600*24*30));, ponieważ trzeci argument funkcji setcookie() oznacza czas wygaśnięcia ciasteczka podany jako znacznik czasu Unix, czyli liczba sekund od 1 stycznia 1970 roku. Funkcja time() zwraca aktualny czas właśnie w sekundach, więc trzeba do niego dodać liczbę sekund odpowiadającą 30 dniom. Jeden dzień ma 24 godziny, jedna godzina 3600 sekund, więc 3600*24*30 daje okres trzydziestu dni. Dzięki temu przeglądarka zapisze ciasteczko o nazwie dane z wartością zmiennej i będzie je przechowywać przez wskazany czas. W praktyce tak zapisuje się np. preferencje użytkownika, wybrany motyw strony, prostą informację o zaakceptowaniu regulaminu albo identyfikator koszyka. Z mojego doświadczenia warto pamiętać, że setcookie() trzeba wywołać przed wysłaniem jakiejkolwiek treści HTML do przeglądarki, bo ciasteczko jest ustawiane przez nagłówek HTTP. Dobrą praktyką jest też ustawianie dodatkowych parametrów, takich jak path, secure, httponly i samesite, szczególnie gdy ciasteczko ma związek z logowaniem albo bezpieczeństwem użytkownika.
W tym pytaniu kluczowe jest zrozumienie, że czas ważności ciasteczka w PHP nie jest podawany jako liczba dni, tylko jako konkretny moment wygaśnięcia zapisany w sekundach w formacie Unix timestamp. Dlatego samo dodanie liczby 30 do time() oznaczałoby tylko 30 sekund od aktualnego momentu, a nie 30 dni. To dość częsty błąd, bo intuicyjnie można pomyśleć, że skoro w treści jest napisane „30 dni”, to wystarczy gdzieś wpisać 30. Niestety funkcja setcookie() tak tego nie interpretuje. Podanie wartości 30 jako trzeciego argumentu również nie oznacza trzydziestu dni. Oznaczałoby to datę wygaśnięcia bardzo blisko początku epoki Uniksa, czyli praktycznie ciasteczko byłoby już nieważne i przeglądarka mogłaby je od razu usunąć. Jest też różnica między nazwą ciasteczka a jego wartością: nazwa "dane" identyfikuje ciasteczko, ale wartością ma być zawartość zmiennej, a nie tekst "dane" zapisany na sztywno. W realnych aplikacjach takie pomyłki powodują trudne do złapania błędy, na przykład ustawienia użytkownika znikają po kilku sekundach albo w ciasteczku zapisuje się stały napis zamiast faktycznych danych. Poprawne podejście polega na przeliczeniu okresu przechowywania na sekundy i dodaniu go do aktualnego czasu. Moim zdaniem to jedna z tych rzeczy w PHP, którą warto zapamiętać raz porządnie, bo potem wraca przy sesjach, logowaniu i personalizacji strony.