Dataniedziela, 9 sierpnia 2026 Czas06:59:40
← Aplikacje internetowe (PHP)

Lekcja 13. Sesje w PHP — wprowadzenie

Trudny / egzaminacyjny

Po co się tego uczymy?

Bez sesji każda strona "zapominałaby" Cię natychmiast po kliknięciu linku — logowanie, koszyk, panel użytkownika (wszystko, co planujesz zrobić w kolejnych lekcjach) byłoby niemożliwe. To jeden z najważniejszych mechanizmów w całym dziale.

Teoria

HTTP (protokół, którym przeglądarka rozmawia z serwerem) jest z natury "bezstanowy" — każde wejście na nową stronę to osobne, niezależne żądanie, które NIC nie pamięta o poprzednim. Bez dodatkowego mechanizmu serwer po każdym kliknięciu "zapominałby", że to wciąż Ty jesteś zalogowany.

Rozwiązaniem są sesje. Sesja to sposób przechowywania danych o konkretnym użytkowniku między kolejnymi stronami — dopóki nie zamknie przeglądarki albo się nie wyloguje.

Podstawy:
session_start(); — MUSI być pierwszą instrukcją w pliku, przed jakimkolwiek echo czy HTML-em. Uruchamia albo wznawia sesję.
$_SESSION["klucz"] = wartosc; — zapisuje dane w sesji (działa jak tablica asocjacyjna).
$_SESSION["klucz"] — odczytuje wcześniej zapisaną wartość na INNEJ stronie, w kolejnym żądaniu.
session_destroy(); — kończy sesję (używane przy wylogowaniu, Lekcja 15).

To dokładnie ten mechanizm pozwala stronie "pamiętać", że jesteś zalogowany (Lekcja 15) i co masz w koszyku (Lekcja 17), mimo że w międzyczasie oglądasz zupełnie inne podstrony.

Schemat

Strona 1: login.php          Strona 2: katalog.php        Strona 3: koszyk.php
   session_start()      -->     session_start()      -->     session_start()
   $_SESSION["user"]="Ala"      echo $_SESSION["user"]        echo $_SESSION["user"]
                                 (nadal "Ala"!)                (nadal "Ala"!)

Sesja "pamięta" dane użytkownika między osobnymi, kolejnymi wejściami na strony.

Przykład z życia

Logujesz się raz na stronie serwisu filmowego, a potem przez godzinę przeglądasz różne podstrony (katalog, szczegóły filmu, koszyk) — i przez cały ten czas strona "wie", że to Ty, bez konieczności logowania się ponownie na każdej podstronie. To właśnie sesja.

Kod (PHP)

<?php
// plik: start.php
session_start(); // musi być pierwsze, przed jakimkolwiek echo

$_SESSION["uzytkownik"] = "Ala";
$_SESSION["liczba_odwiedzin"] = 1;

echo "Sesja rozpoczęta dla: " . $_SESSION["uzytkownik"];
echo '<br><a href="druga_strona.php">Przejdź do drugiej strony</a>';

<?php
// plik: druga_strona.php - zupełnie inny plik, otwarty osobno!
session_start();

if (isset($_SESSION["uzytkownik"])) {
    $_SESSION["liczba_odwiedzin"]++;
    echo "Witaj ponownie, " . $_SESSION["uzytkownik"] . "!<br>";
    echo "To Twoje " . $_SESSION["liczba_odwiedzin"] . " działanie w tej sesji.";
} else {
    echo "Nie masz aktywnej sesji - wróć do start.php";
}

Komentarz i wyjaśnienie kodu

session_start() na początku KAŻDEGO pliku, który chce korzystać z sesji, jest obowiązkowe — musi wystąpić zanim jakikolwiek HTML/echo zostanie wysłany do przeglądarki, inaczej PHP zgłosi błąd "headers already sent". Zwróć uwagę, że start.php i druga_strona.php to DWA OSOBNE pliki/żądania, a mimo to $_SESSION["uzytkownik"] ustawione w pierwszym pliku jest nadal dostępne w drugim — to jest właśnie "magia" sesji: dane przetrwały między osobnymi wejściami na stronę.

Ćwiczenie samodzielne

Dodaj do sesji trzecią wartość — $_SESSION["ulubiony_gatunek"] — i wypisz ją na drugiej stronie.

Zadania do pracy własnej

  1. Napisz dwa pliki PHP: pierwszy zapisuje w sesji Twoje imię, drugi je odczytuje i wyświetla powitanie.

  2. Napisz licznik odwiedzin: za każdym odświeżeniem STRONY (nie osobnych plików) zwiększaj $_SESSION["licznik"] o 1 i wyświetlaj aktualną wartość.

  3. Napisz mechanizm "ostatnio oglądane filmy": za każdym wejściem na stronę szczegółów filmu (z parametrem ?id=X) dodawaj tytuł filmu do tablicy $_SESSION["historia"] (jeśli jeszcze go tam nie ma), a na osobnej stronie wyświetl listę ostatnio oglądanych filmów z tej sesji.

Typowe błędy

Najczęstszy błąd to brak session_start() na którejś ze stron korzystających z $_SESSION — bez tego PHP w ogóle nie "widzi" danych sesji. Drugi błąd: umieszczenie session_start() PO jakimkolwiek echo albo nawet po białym znaku przed <?php — musi być absolutnie pierwsze. Trzeci: mylenie sesji z "trwałym" zapisem — dane sesji znikają, gdy użytkownik zamknie przeglądarkę albo minie czas jej ważności; do trwałego zapisu (np. historii zamówień) służy baza danych, nie sesja.

Nawiązanie do egzaminu zawodowego

To realizacja efektu INF.03.5.4.7 ("korzysta z funkcji do obsługi ciasteczek oraz sesji") — fundament pod logowanie (Lekcja 15), ochronę stron (Lekcja 16) i koszyk (Lekcja 17), czyli większość praktycznego projektu tego działu.