Lekcja 18. Podsumowanie koszyka i symulacja płatności
Trudny / egzaminacyjnyPo 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
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.
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.
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ą.