Lekcja 10. Zapis danych z formularza do bazy danych (INSERT)
ŚredniPo 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
Stwórz formularz i skrypt PHP dodający nowego klienta (imię, nazwisko, e-mail) do tabeli Klienci.
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.
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.