Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe PHP

Słowa kluczowe: Cookie Funkcja time() w PHP setcookie() w PHP

Jak przy użyciu języka PHP zapisać w ciasteczku o nazwie dane wartość zmiennej $dane na okres jednego tygodnia?

A.
setcookie("dane", $dane, 7);
B.
setcookie("dane", $dane, time() + (3600*24*7));
C.
setcookie("dane", $dane, time() + 7);
D.
setcookie("dane", "dane", 3600*24*7);
W tej instrukcji dobrze użyto funkcji setcookie("dane", $dane, time() + (3600*24*7));, bo trzeci parametr funkcji setcookie() w PHP oznacza czas wygaśnięcia ciasteczka podany jako znacznik czasu Unix, czyli liczba sekund od 1 stycznia 1970 roku. Sama wartość 3600*24*7 daje liczbę sekund w jednym tygodniu: 3600 sekund to godzina, razy 24 godziny, razy 7 dni. Dopiero dodanie tego do time() tworzy poprawną datę wygaśnięcia liczona od aktualnego momentu. To jest właśnie najważniejszy szczegół w tym pytaniu. Moim zdaniem to jeden z tych przykładów, gdzie składnia jest prosta, ale łatwo pomylić czas trwania z konkretną datą wygaśnięcia. W praktyce takim ciasteczkiem można zapamiętać np. wybrany motyw strony, zgodę użytkownika, język interfejsu albo prosty identyfikator koszyka. Warto też pamiętać o dobrej praktyce: setcookie() trzeba wywołać przed wysłaniem jakiegokolwiek HTML-a do przeglądarki, bo ciasteczka są ustawiane w nagłówkach HTTP. W prawdziwych aplikacjach dobrze dopisać też parametry path, secure, httponly oraz samesite, szczególnie gdy przechowujemy dane związane z logowaniem albo bezpieczeństwem.
W niepoprawnych wariantach pojawia się typowe pomieszanie dwóch pojęć: czasu trwania ciasteczka i bezwzględnego czasu jego wygaśnięcia. Funkcja setcookie() nie oczekuje w trzecim parametrze samej liczby dni ani samej liczby sekund „od teraz”. Ona oczekuje znacznika czasu Unix, czyli konkretnego momentu w czasie. Dlatego wpisanie samej wartości 7 nie oznacza tygodnia, tylko datę znajdującą się praktycznie na początku epoki Unix, więc dla współczesnej przeglądarki takie ciasteczko byłoby od razu przeterminowane albo potraktowane jak usuwane. Podobny problem jest z samym 3600*24*7. Rachunek sekund dla tygodnia jest poprawny, ale bez dodania time() nadal jest to tylko liczba 604800, czyli data z 1970 roku, a nie tydzień od bieżącego żądania. Do tego dochodzi jeszcze błąd z wartością ciasteczka: zapisanie tekstu "dane" oznacza literał znakowy, a nie zawartość zmiennej $dane. To ma duże znaczenie, bo użytkownik dostałby zawsze ten sam napis, a nie rzeczywiste dane obliczone w programie. Z kolei time() + 7 jest już bliższe właściwemu mechanizmowi, bo używa aktualnego czasu, ale dodaje tylko 7 sekund, nie 7 dni. Z mojego doświadczenia takie pomyłki biorą się z tego, że w wielu bibliotekach podaje się TTL, czyli czas życia w sekundach, a w PHP przy setcookie() historycznie podaje się konkretną datę wygaśnięcia. Dobra zasada jest prosta: jeśli ciasteczko ma wygasnąć za jakiś czas, liczysz ten okres w sekundach i dodajesz go do time().

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.