Dataniedziela, 9 sierpnia 2026 Czas07:12:18
← Aplikacje internetowe (PHP)

Lekcja 10. Zapis danych z formularza do bazy danych (INSERT)

Średni

Po co się tego uczymy?

To pierwszy moment w tym przygotowaniu do egzaminu, w którym Twoja strona internetowa naprawdę "pamięta" to, co wpisze użytkownik — po odświeżeniu strony, a nawet po wyłączeniu komputera. Bez zapisu do bazy każdy formularz to tylko ładny, ale bezużyteczny widok.

Teoria

Teraz połączysz Lekcję 7 (formularz), Lekcję 8 (walidacja) i Lekcję 9 (połączenie z bazą) w jedną całość: dane wpisane przez użytkownika w formularzu trafiają, po walidacji, prosto do tabeli w bazie danych poleceniem INSERT.

Schemat pracy:
1. Formularz HTML wysyła dane metodą POST.
2. PHP odbiera dane z $_POST i je waliduje.
3. Jeśli dane są poprawne, PHP buduje zapytanie SQL INSERT, wstawiając do niego wartości ze zmiennych.
4. PHP wykonuje zapytanie przez mysqli_query().
5. PHP informuje użytkownika o sukcesie albo błędzie.

Uwaga na przyszłość: w tej lekcji budujemy zapytanie przez "sklejanie" tekstu — to działa, ale ma słabość bezpieczeństwa (SQL injection), którą naprawimy w Lekcji 19 za pomocą tzw. zapytań przygotowanych (prepared statements). Na razie skup się na zrozumieniu samego mechanizmu.

Przykład z życia

Formularz "Dodaj film do katalogu" w panelu administratora serwisu filmowego — administrator wpisuje tytuł, rok i gatunek, a po kliknięciu "Zapisz" ten film pojawia się w bazie i staje się widoczny dla wszystkich użytkowników serwisu.

Kod (PHP)

<?php
$polaczenie = mysqli_connect("localhost", "root", "", "serwis_filmowy");
if (!$polaczenie) {
    die("Błąd połączenia: " . mysqli_connect_error());
}

if (isset($_POST["tytul"]) && isset($_POST["rok"]) && isset($_POST["gatunek"])) {
    $tytul = mysqli_real_escape_string($polaczenie, $_POST["tytul"]);
    $rok = (int) $_POST["rok"];
    $gatunek = mysqli_real_escape_string($polaczenie, $_POST["gatunek"]);

    if (empty($tytul)) {
        echo "Tytuł jest wymagany.";
    } else {
        $zapytanie = "INSERT INTO Filmy (tytul, rok_produkcji, gatunek)
                       VALUES ('$tytul', $rok, '$gatunek')";

        if (mysqli_query($polaczenie, $zapytanie)) {
            echo "Film został dodany do bazy!";
        } else {
            echo "Błąd zapisu: " . mysqli_error($polaczenie);
        }
    }
}

mysqli_close($polaczenie);

Komentarz i wyjaśnienie kodu

mysqli_real_escape_string() "oczyszcza" tekst wpisany przez użytkownika z niebezpiecznych znaków (np. cudzysłowów), zanim trafi do zapytania SQL — to podstawowa, choć niewystarczająca w pełni ochrona (pełne rozwiązanie w Lekcji 19). Rok produkcji rzutujemy jawnie na (int) — dzięki temu, nawet jeśli ktoś wpisze coś dziwnego w to pole, PHP i tak zamieni to na liczbę (albo 0). mysqli_query() zwraca true przy powodzeniu i false przy błędzie — sprawdzamy to, żeby pokazać użytkownikowi trafny komunikat, a nie milczeć w razie problemu.

Ćwiczenie samodzielne

Dodaj do formularza i zapytania INSERT czwartą kolumnę — cena_wypozyczenia (typu float).

Zadania do pracy własnej

  1. Stwórz formularz i skrypt PHP dodający nowego klienta (imię, nazwisko, e-mail) do tabeli Klienci.

  2. Stwórz formularz i skrypt dodający nową opinię o filmie (tytuł filmu, ocena 1-5, treść opinii) do tabeli Opinie, z pełną walidacją z Lekcji 8 przed zapisem.

  3. Stwórz formularz i skrypt dodający nowe zamówienie w sklepie: klient wybiera produkt (na razie wpisując jego id ręcznie) i ilość, a skrypt sprawdza, czy oba pola są poprawnymi liczbami, po czym zapisuje wiersz do tabeli Zamowienia i wypisuje potwierdzenie z podsumowaniem tego, co zostało zapisane.

Typowe błędy

Częsty błąd to zapomnienie cudzysłowów wokół wartości tekstowych w zapytaniu SQL budowanym w PHP (np. VALUES ($tytul, ...) zamiast VALUES ('$tytul', ...)) — SQL zgłosi błąd składni. Drugi błąd: brak walidacji przed INSERT, przez co do bazy trafiają puste albo bezsensowne dane. Trzeci: niesprawdzenie wyniku mysqli_query() — skrypt "milczy" o błędzie, a programista długo szuka, dlaczego dane się nie zapisały.

Nawiązanie do egzaminu zawodowego

To realizacja efektu INF.03.5.4.5 w praktyce — bezpośrednie połączenie formularza (03.5.4.4) z bazą danych. Tego typu zadanie ("stwórz formularz zapisujący dane do bazy") to jeden z najbardziej typowych scenariuszy w części praktycznej egzaminu INF.03.