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"];
isset wykrywa istniejący licznik, więc przy kolejnych wejściach wykonuje się zwiększenie o 1.PHPSESSID. Ciasteczko ustawia setcookie().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.