Dataczwartek, 13 sierpnia 2026 Czas19:02:13
← Aplikacje internetowe (PHP)

Lekcja 18. Podsumowanie koszyka i symulacja płatności

Trudny / egzaminacyjny

Po co się tego uczymy?

To moment, w którym Twój koszyk (dane tymczasowe, żyjące tylko w sesji) zamienia się w prawdziwe, trwałe zamówienie w bazie danych — dokładnie tak, jak wygląda finalizacja zakupów w każdym prawdziwym sklepie internetowym.

Teoria

To ostatni krok przed pełnym projektem: zamiana zawartości koszyka (Lekcja 17) w prawdziwe zamówienie zapisane w bazie danych (Lekcja 10), z prostą, SYMULOWANĄ płatnością — bez podłączania prawdziwego operatora płatności (to wykracza poza zakres tego materiału i wymaga zewnętrznych, płatnych usług).

Proces składania zamówienia:
1. Wyświetl podsumowanie koszyka z sumą całkowitą do zapłaty.
2. Pokaż prosty formularz "dane do zamówienia" (albo tylko przycisk "Zapłać", jeśli klient jest już zalogowany).
3. Po kliknięciu "Zapłać": zapisz zamówienie i jego pozycje do bazy danych (dwie tabele: Zamowienia i PozycjeZamowienia, dokładnie jak w Zadaniu 19 z działu Bazy danych i SQL).
4. Wyczyść koszyk w sesji ($_SESSION["koszyk"] = [];).
5. Pokaż stronę "Dziękujemy za zakup" z numerem zamówienia.

"Symulacja" oznacza, że NIE łączymy się z prawdziwym bankiem/operatorem — po prostu zakładamy, że płatność się powiodła, i realizujemy zamówienie od razu.

Schemat

Koszyk (sesja)  ->  Podsumowanie (suma, lista)  ->  "Zapłać" (formularz)
                                                          |
                                              Zapis zamówienia do bazy
                                                          |
                                              Wyczyszczenie koszyka w sesji
                                                          |
                                              Strona "Dziękujemy za zakup"

Przykład z życia

Kliknięcie "Zapłać" w dowolnym sklepie internetowym uruchamia dokładnie taki proces: zapisanie zamówienia w systemie sklepu, wyczyszczenie koszyka i pokazanie strony z podziękowaniem — różnica jest tylko taka, że prawdziwy sklep łączy się dodatkowo z bankiem/operatorem płatności, czego w tym kursie celowo nie robimy.

Kod (PHP)

<?php
session_start();
$polaczenie = mysqli_connect("localhost", "root", "", "serwis_filmowy");

if (isset($_POST["zaplac"]) && isset($_SESSION["user_id"]) && !empty($_SESSION["koszyk"])) {
    $idKlienta = $_SESSION["user_id"];

    // 1. zapisz nagłówek zamówienia
    $zapytanie = "INSERT INTO Zamowienia (id_klienta, data_zamowienia) VALUES ($idKlienta, NOW())";
    mysqli_query($polaczenie, $zapytanie);
    $idZamowienia = mysqli_insert_id($polaczenie); // id właśnie wstawionego wiersza

    // 2. zapisz każdą pozycję koszyka jako osobny wiersz
    foreach ($_SESSION["koszyk"] as $idFilmu => $ilosc) {
        $zapytaniePozycji = "INSERT INTO PozycjeZamowienia (id_zamowienia, id_filmu, ilosc)
                              VALUES ($idZamowienia, $idFilmu, $ilosc)";
        mysqli_query($polaczenie, $zapytaniePozycji);
    }

    // 3. wyczyść koszyk - "płatność" zakończona
    $_SESSION["koszyk"] = [];

    echo "Dziękujemy za zakup! Numer Twojego zamówienia: " . $idZamowienia;
} else {
    echo "Brak produktów w koszyku albo nie jesteś zalogowany.";
}

mysqli_close($polaczenie);

Komentarz i wyjaśnienie kodu

mysqli_insert_id($polaczenie) to bardzo przydatna funkcja — zwraca ID wiersza, który WŁAŚNIE wstawiłeś (dzięki AUTO_INCREMENT), więc możesz go od razu użyć jako id_zamowienia przy zapisywaniu pozycji zamówienia. Pętla foreach po $_SESSION["koszyk"] zapisuje KAŻDĄ pozycję koszyka jako osobny wiersz w tabeli PozycjeZamowienia — to dokładnie ta sama struktura "zamówienie + pozycje zamówienia", którą poznałeś w Zadaniu 19 działu Bazy danych i SQL. Wyczyszczenie $_SESSION["koszyk"] = []; na końcu zapobiega przypadkowemu "podwójnemu" złożeniu tego samego zamówienia.

Ćwiczenie samodzielne

Dodaj wypisanie pełnego podsumowania zamówienia (lista pozycji z ilościami) razem z komunikatem "Dziękujemy".

Zadania do pracy własnej

  1. Napisz stronę podsumowania koszyka wypisującą sumę do zapłaty (potrzebujesz ceny filmów z bazy, tak jak w zadaniu z Lekcji 17) przed przejściem do płatności.

  2. Dodaj do procesu płatności prosty formularz z polem "adres dostawy" (albo "sposób odbioru") i zapisz tę informację razem z zamówieniem w bazie.

  3. Zbuduj pełny proces: strona koszyka z sumą całkowitą → przycisk "Przejdź do płatności" → strona z podsumowaniem i przyciskiem "Zapłać" → zapis zamówienia i pozycji do bazy → strona "Dziękujemy" z numerem zamówienia i pełną listą zakupionych filmów pobraną z bazy (JOIN Zamowienia + PozycjeZamowienia + Filmy).

Typowe błędy

Częsty błąd to wyczyszczenie koszyka PRZED zapisaniem jego zawartości do bazy — wtedy pętla foreach po pustym już koszyku nic nie zapisze. Drugi błąd: brak sprawdzenia, czy koszyk w ogóle nie jest pusty, przed próbą złożenia zamówienia. Trzeci: zapomnienie o sprawdzeniu, czy użytkownik jest zalogowany (Lekcja 16) — zamówienie musi być przypisane do konkretnego id_klienta z sesji.

Nawiązanie do egzaminu zawodowego

To domknięcie pełnego cyklu efektów INF.03.5.4 w jednym, kompletnym scenariuszu (formularz → baza → sesja → baza) — dokładnie taki poziom złożoności, jakiego można się spodziewać w rozbudowanym zadaniu praktycznym na egzaminie INF.03/INF.04 z aplikacją webową.