Lekcja 13. Sesje w PHP — wprowadzenie
Trudny / egzaminacyjnyPo 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
Napisz dwa pliki PHP: pierwszy zapisuje w sesji Twoje imię, drugi je odczytuje i wyświetla powitanie.
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ść.
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.