Dataczwartek, 13 sierpnia 2026 Czas17:54:05
← Aplikacje internetowe (PHP)

Lekcja 17. Koszyk zakupowy w sesji

Trudny / egzaminacyjny

Po co się tego uczymy?

To flagowy przykład praktycznego zastosowania sesji, którego uczysz się od Lekcji 13 — koszyk to dokładnie ten typ danych, który MUSI "przetrwać" przejście na kilka różnych podstron, ale nie zasługuje jeszcze na zapis do bazy (dopóki zamówienie nie zostanie złożone, jak w Lekcji 18).

Teoria

Koszyk zakupowy to jeden z najbardziej praktycznych przykładów użycia sesji — musi "pamiętać" wybrane produkty, gdy przechodzisz między podstronami sklepu, ale nie musi (na razie) trafiać do bazy danych, dopóki zamówienie nie zostanie faktycznie złożone.

Najprostszy koszyk to tablica w sesji, gdzie kluczem jest id produktu, a wartością — ilość sztuk:
$_SESSION["koszyk"][id_produktu] = ilość;

Główne operacje:
Dodanie produktu — jeśli produkt jest już w koszyku, zwiększ ilość; jeśli nie, dodaj go z ilością 1.
Wyświetlenie koszyka — pętla foreach po $_SESSION["koszyk"], dla każdego id pobierz szczegóły produktu z bazy danych (JOIN dwóch "światów": sesji i bazy).
Usunięcie z koszykaunset($_SESSION["koszyk"][id_produktu]);

Przykład z życia

Przeglądasz katalog filmów, klikasz "Wypożycz" przy trzech różnych tytułach, a potem przechodzisz do innej zakładki i wracasz — koszyk nadal pokazuje te same trzy filmy. To dokładnie ten sam mechanizm sesji, którego nauczyłeś się w Lekcji 13, zastosowany do prawdziwego problemu.

Kod (PHP)

<?php
session_start();

// upewnij się, że koszyk istnieje w sesji (przy pierwszym użyciu)
if (!isset($_SESSION["koszyk"])) {
    $_SESSION["koszyk"] = [];
}

// dodanie filmu do koszyka - np. przycisk "Wypożycz" wysyła ?dodaj=5
if (isset($_GET["dodaj"])) {
    $idFilmu = (int) $_GET["dodaj"];

    if (isset($_SESSION["koszyk"][$idFilmu])) {
        $_SESSION["koszyk"][$idFilmu]++;
    } else {
        $_SESSION["koszyk"][$idFilmu] = 1;
    }

    echo "Dodano film do koszyka!<br>";
}

// usunięcie filmu z koszyka
if (isset($_GET["usun"])) {
    $idFilmu = (int) $_GET["usun"];
    unset($_SESSION["koszyk"][$idFilmu]);
    echo "Usunięto film z koszyka.<br>";
}

echo "Liczba różnych filmów w koszyku: " . count($_SESSION["koszyk"]);

Komentarz i wyjaśnienie kodu

Koszyk to tablica ZAGNIEŻDŻONA w sesji: $_SESSION["koszyk"] to cała tablica produktów, a $_SESSION["koszyk"][$idFilmu] to konkretna ilość sztuk danego filmu. Warunek isset($_SESSION["koszyk"][$idFilmu]) sprawdza, czy TEN KONKRETNY film już jest w koszyku — jeśli tak, zwiększamy licznik, jeśli nie, tworzymy nowy wpis z wartością 1. unset() usuwa pojedynczy klucz z tablicy — dokładnie ten film, nie cały koszyk.

Ćwiczenie samodzielne

Dodaj przycisk/link "Wyczyść cały koszyk", który ustawia $_SESSION["koszyk"] z powrotem na pustą tablicę.

Zadania do pracy własnej

  1. Rozbuduj przykład tak, żeby po dodaniu filmu wypisywał też, ile sztuk TEGO KONKRETNEGO filmu jest już w koszyku.

  2. Napisz stronę wyświetlającą zawartość koszyka jako listę: dla każdego id_filmu w $_SESSION["koszyk"] pobierz z bazy tytuł i cenę (SELECT ... WHERE id_filmu = ...), wypisz je razem z ilością.

  3. Zbuduj kompletny mechanizm koszyka: strona katalogu z przyciskami "Dodaj do koszyka" przy każdym filmie, osobna strona koszyk.php wyświetlająca zawartość w formie tabeli (tytuł, cena jednostkowa, ilość, wartość pozycji) z linkiem "Usuń" przy każdej pozycji oraz sumą całkowitą na dole tabeli.

Typowe błędy

Częsty błąd to nadpisanie całego koszyka zamiast dodania jednego produktu ($_SESSION["koszyk"] = $idFilmu; zamiast $_SESSION["koszyk"][$idFilmu] = ...;) — to kasuje wszystkie wcześniej dodane produkty. Drugi błąd: brak sprawdzenia isset($_SESSION["koszyk"]) na początku strony — przy pierwszym wejściu ta zmienna jeszcze nie istnieje. Trzeci: zapomnienie session_start() na którejś ze stron korzystających z koszyka.

Nawiązanie do egzaminu zawodowego

To zaawansowane zastosowanie efektu INF.03.5.4.7 (sesje) połączone z 03.5.4.5 (baza danych) — koszyk zakupowy to jeden z klasycznych, w pełni rozpoznawalnych elementów "serwisu ogłoszeniowego czy rezerwacyjnego", wprost wymienionego w podstawie programowej INF.04/INF.03 jako przykładowy typ aplikacji.