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

Jaki jest efekt wielokrotnego wykonania poniższego kodu PHP przez tego samego użytkownika w czasie jednej sesji?

session_start();
if (!isset($_SESSION["licznik"]))
    $_SESSION["licznik"] = 1;
else
    $_SESSION["licznik"]++;
echo $_SESSION["licznik"];
A. Wyświetlenie łącznej liczby odwiedzin strony przez wszystkich użytkowników.
Źle. Każdy użytkownik ma własną sesję. Wspólny licznik wymagałby zapisu w bazie danych lub pliku.
B. Wyświetlanie wartości 1 przy każdym odświeżeniu strony.
Źle. isset wykrywa istniejący licznik, więc przy kolejnych wejściach wykonuje się zwiększenie o 1.
C. Zapisanie licznika w ciasteczku o nazwie licznik.
Źle. Dane sesji są na serwerze, a w ciasteczku jest tylko identyfikator PHPSESSID. Ciasteczko ustawia setcookie().
D. Wyświetlenie liczby odsłon strony w bieżącej sesji użytkownika.
Dobrze. Zmienna sesyjna przy pierwszym wejściu dostaje 1, a przy każdym kolejnym rośnie o 1.

session_start() wznawia sesję użytkownika albo tworzy nową. Przy pierwszym wejściu zmiennej sesyjnej licznik jeszcze nie ma, więc isset zwraca fałsz i licznik dostaje 1. Przy każdym kolejnym odświeżeniu wartość rośnie o 1. Skrypt wypisze więc 1, 2, 3 i tak dalej, czyli liczbę odsłon w bieżącej sesji.

Dane sesji są przechowywane na serwerze, osobno dla każdego użytkownika. Przeglądarka dostaje tylko identyfikator w ciasteczku PHPSESSID. Sesja kończy się po zamknięciu przeglądarki, po czasie bezczynności albo po session_destroy(), a wtedy licznik zaczyna od 1. Ważne: session_start() musi stać przed jakimkolwiek wyjściem HTML, bo wysyła nagłówki.

Wybór błędnej odpowiedzi bierze się zwykle z niezrozumienia, gdzie żyje zmienna $_SESSION. Każdy użytkownik ma własną sesję, więc licznik jednej osoby nie widzi wejść innych. Łączną liczbę odwiedzin wszystkich osób trzeba by zapisywać w bazie danych albo w pliku na serwerze.

Stała wartość 1 pojawiłaby się wtedy, gdyby kod za każdym razem przypisywał 1 bez sprawdzania. Tutaj isset wykrywa, że licznik już istnieje, i wykonuje się gałąź z ++. Mogłoby się tak stać także przy braku session_start(), ale w kodzie to wywołanie jest.

Wartość licznika nie trafia do ciasteczka. W ciasteczku PHPSESSID jest tylko identyfikator sesji, a liczba zostaje na serwerze. Licznik w ciasteczku wymagałby funkcji setcookie(), której ten kod nie wywołuje.

W innej przeglądarce ten sam użytkownik dostanie nową sesję i licznik od 1.

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.