INF.03 · Aplikacje internetowe PHP
Sesje w PHP — wprowadzenie
Sesja pamięta między żądaniami.
- PHP8.3
- mysqli · MariaDB
- Praktyka i diagnoza
Po tej lekcji: Rozdzielisz identyfikator w cookie od danych na serwerze oraz sprawdzisz dwie niezależne sesje.
Zrozum mechanizm
Zwykła zmienna PHP znika po zakończeniu żądania. Sesja pozwala odtworzyć stan w kolejnych żądaniach. Cookie przeglądarki przechowuje identyfikator, a dane $_SESSION są po stronie serwera. Nie wkładaj do sesji jawnego hasła i nie pokazuj identyfikatora w HTML lub adresie URL.
Session_start otwiera lub odtwarza sesję przed wysłaniem HTML. Strict mode odrzuca nieznane, narzucone ID; use_only_cookies eliminuje przekazywanie ID przez URL. Cookie HttpOnly utrudnia odczyt skryptem, Secure wymaga HTTPS, SameSite ogranicza część żądań między witrynami, lecz nie zastępuje tokenu CSRF. Na lokalnym HTTP Secure=false jest świadomym ustawieniem do ćwiczeń, na publicznym HTTPS musi być true.
W projekcie sesja logowania wygasa po 30 min bezczynności i po 8 h niezależnie od aktywności. Po wygaśnięciu zmieniamy ID i czyścimy dane. Session_destroy nie jest tym samym co usunięcie cookie; pełne wylogowanie poznasz za chwilę.
Jak uruchamiać krótkie przykłady?
Każdy krótki przykład oznaczony własnym plikiem uruchamiaj osobno, nie doklejaj wszystkich definicji do jednego pliku. W edytorze zapisz go jako .php, a w terminalu tego folderu wpisz np. php for.php. Wtedy pokazane końce wierszy PHP_EOL są widoczne. W odpowiedzi HTML znak końca wiersza sam nie robi nowej linii na ekranie: użyj <br> albo znacznika <pre>. Wyświetl źródło pozwala zobaczyć tekst odpowiedzi.
Przykłady opisane jako fragment projektu wymagają paczki KINO / LAB i wcześniejszej konfiguracji. Nie uruchamiaj ich jako samodzielnych endpointów. Pełny plik niżej pokazuje kontekst. Funkcje h(), pole() i wymagajPost() są nasze; ich definicje wczytuje bootstrap.php.
Sesja: uruchom, zapisz, odczytaj
Odświeżenie to nowe żądanie. Zwykła zmienna zaczyna od nowa, ale sesja pozwala odczytać wcześniejszy stan przypisany do cookie przeglądarki.
Podstawowa forma: session_start(); → $_SESSION["klucz"] = wartosc;
<?php
// Samodzielny plik lokalny. session_start musi być przed HTML.
session_start();
$_SESSION['odwiedziny'] = ($_SESSION['odwiedziny'] ?? 0) + 1;
echo 'Odwiedziny w tej sesji: ' . $_SESSION['odwiedziny'];
- session_start odtwarza sesję na podstawie identyfikatora cookie albo tworzy nową. Puste nawiasy oznaczają wywołanie bez własnych argumentów.
- $_SESSION jest specjalną tablicą. W pierwszym żądaniu nie ma klucza odwiedziny, więc ?? daje 0; dodajemy 1 i zapisujemy wynik.
- W następnym żądaniu z tym samym cookie odczytamy 1, zapiszemy 2 i wyświetlimy 2. Inna sesja przeglądarki ma osobny licznik.
- To minimalna ilustracja, nie nowy bootstrap projektu. Pełna paczka ustawia bezpieczne opcje cookie i timeout przed uruchomieniem sesji; nie dopisuj do niej drugiego session_start.
Jak czytać pozostałe zapisy w pełnym przykładzie
| Zapis | Znaczenie | Przykład użycia |
|---|---|---|
naglowek($tytul), stopka() | Nasze funkcje wypisujące wspólny HTML strony. void oznacza brak zwracanego wyniku do użycia w wyrażeniu. | naglowek("Katalog"); |
dirname(__DIR__) | dirname daje katalog nadrzędny; __DIR__ to katalog bieżącego pliku. W public prowadzi to do katalogu projektu, a dopisana ścieżka wskazuje src. | dirname(__DIR__)."/src/bootstrap.php" |
$_SESSION i $_POST | Specjalne tablice PHP: pierwsza to stan sesji, druga dane formularza POST. Zewnętrzne wartości trzeba sprawdzić, nie ufać samym nazwom kluczy. | $_SESSION["user_id"] |
?? i ??= | a ?? b wybiera b dla braku/null; a ??= b zapisuje b tylko, gdy a nie istnieje lub ma null. Nie reagują na0 ani pusty napis. | $_SESSION["koszyk"] ??= []; |
Sprawdź w działaniu
Sesja pamięta między żądaniami — sprawdź w modelu
Model w przeglądarce wyjaśnia mechanizm na fikcyjnych danych. Nie wykonuje PHP ani zapytań SQL i nie tworzy kont. Prawdziwe skrypty uruchomisz lokalnie z paczki.
Przewidź rezultat, wykonaj próbę i wyjaśnij, która decyzja po stronie serwera decyduje o wyniku.
Uruchom krok po kroku
Otwórz sesja.php i odśwież trzy razy: zwykła zmienna nadal ma 1, sesja rośnie. Otwórz zwykłą drugą kartę tej samej przeglądarki — współdzieli cookie i sesję. Okno prywatne lub drugi profil ma osobny stan. W Network/Application zobacz nazwę i atrybuty cookie, nie kopiuj jego wartości do pracy.
Plik wzorcowy: public/sesja.php
<?php
require_once dirname(__DIR__).'/src/bootstrap.php';
// Zwykła zmienna powstaje od nowa. Sesja przetrwa kolejne żądanie z tym cookie.
$zwyklyLicznik = 0;
$zwyklyLicznik++;
$_SESSION['odwiedziny'] = ($_SESSION['odwiedziny'] ?? 0) + 1;
naglowek('Pamięć między żądaniami');
echo '<p>Zwykła zmienna: '.$zwyklyLicznik.'</p>';
echo '<p>W tej sesji: '.(int) $_SESSION['odwiedziny'].'</p>';
echo '<p><a href="/sesja.php">Wykonaj kolejne żądanie</a></p>';
stopka();
Ustawienia cookie i start sesji
ini_set('session.use_strict_mode', '1');
ini_set('session.use_only_cookies', '1');
session_name('KINO_DEMO');
session_set_cookie_params([
'lifetime' => 0, 'path' => '/', 'secure' => $konfiguracja['https'],
'httponly' => true, 'samesite' => 'Lax',
]);
session_start();
Pobierz i odtwórz projekt
W „Źródłach i materiałach” na końcu pobierz KINO / LAB.zip. Rozpakuj całość; instrukcja START.txt opisuje konfigurację. Pierwsze 6 przykładów w public/podstawy działa bez bazy. Dalsze wymagają lokalnej MariaDB 11.4, importu schema.sql i lokalnego konta bazy z minimalnymi prawami. Gotowa paczka pokazuje całość, ale w tej lekcji wykonaj opisane kroki i własne zadanie.
Ćwiczenie z pomocą · samodzielna praca
Twoja próba — podpowiedzi otwieraj po kolei
Porównaj licznik w dwóch kartach jednego profilu i w profilu prywatnym.
Wspólne karty korzystają z jednego licznika; prywatny profil zaczyna osobny. Oddaj opis, bez identyfikatorów sesji.
? Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź
Odszukaj wskazany plik i zapisz przewidywany rezultat przed zmianą.
Krok 2 — pokaż podpowiedź
Zmień jedną rzecz. Sprawdź metodę żądania, dane i odpowiedź lub wynik programu.
Krok 3 — pokaż podpowiedź
Wykonaj próbę graniczną lub błędną. Porównaj także stan bazy lub sesji, nie tylko komunikat.
Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.
Podsumowanie
Co warto zapamiętać
- Rozdzielisz identyfikator w cookie od danych na serwerze oraz sprawdzisz dwie niezależne sesje.
- Potrafisz wskazać w kodzie przyczynę wyniku i zaplanować próbę błędnych danych.
- Nie oddajesz haseł, pliku config.local.php ani wartości cookie.
Dalej na swoim koncie
Rozgrzewki, quiz i zadania są w biurku ucznia.
Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.
Zaloguj się →