INF.03 · Aplikacje internetowe PHP
Zapis danych z formularza do bazy danych (INSERT)
Zapisz rekord, nie fragment SQL.
- PHP8.3
- mysqli · MariaDB
- Praktyka i diagnoza
Po tej lekcji: Zapiszesz zweryfikowany film przez prepared statement oraz odczytasz rolę każdego parametru.
Zrozum mechanizm
INSERT składa się ze stałego szablonu SQL i osobno przekazanych wartości. prepare() przygotowuje strukturę, bind_param() łączy typy z nazwanymi zmiennymi PHP, a execute wykonuje operację. W mysqli s oznacza tekst, i liczbę całkowitą, d zmiennoprzecinkową i b dane binarne. Znak? nie jest otaczany cudzysłowami. Kolejność parametrów odpowiada kolejności znaków?.
Waliduj tytuł, rok, gatunek i cenę. Właściciela bierz z sesji, nigdy z pola formularza. Sprawdź POST i CSRF przed zapisem. Po sukcesie zastosuj 303 do panelu: odświeżenie strony docelowej nie ponawia INSERT. Apostrof w tytule ma pozostać zwykłym znakiem, a nie uszkadzać zapytanie.
Jak uruchamiać krótkie przykłady?
Każdy krótki przykład oznaczony własnym plikiem uruchamiaj osobno, nie doklejaj wszystkich definicji do jednego pliku. W edytorze zapisz go jako .php, a w terminalu tego folderu wpisz np. php for.php. Wtedy pokazane końce wierszy PHP_EOL są widoczne. W odpowiedzi HTML znak końca wiersza sam nie robi nowej linii na ekranie: użyj <br> albo znacznika <pre>. Wyświetl źródło pozwala zobaczyć tekst odpowiedzi.
Przykłady opisane jako fragment projektu wymagają paczki KINO / LAB i wcześniejszej konfiguracji. Nie uruchamiaj ich jako samodzielnych endpointów. Pełny plik niżej pokazuje kontekst. Funkcje h(), pole() i wymagajPost() są nasze; ich definicje wczytuje bootstrap.php.
INSERT: prepare → bind_param → execute
Ten wycinek pokazuje tylko etap zapisu. W pełnym dodaj.php przed nim są już: kontrola sesji, POST, CSRF i walidacja. Nie pomijaj ich w działającej aplikacji.
Podstawowa forma: prepare(SQL) → bind_param(typy, zmienne...) → execute()
<?php
// Fragment wewnątrz obsługi poprawnego POST z dodaj.php:
$zapytanie = $polaczenie->prepare(
'INSERT INTO Filmy (tytul, rok, gatunek, cena_grosze, wlasciciel_id)
VALUES (?, ?, ?, ?, ?)'
);
$zapytanie->bind_param('sisii', $tytul, $rok, $gatunek, $cena, $idUzytkownika);
$zapytanie->execute();
- prepare dostaje stały szablon. Każdy znak ? jest miejscem na jedną wartość; nie zapisuj go jako "?" w cudzysłowie SQL.
-
sisiiopisuje pięć wartości: string, int, string, int, int. s to tekst, i to liczba całkowita, d zmiennoprzecinkowa, b dane binarne. - Kolejność zmiennych musi odpowiadać kolumnom i znakom ?. Przekazujesz zmienne — bind_param wiąże je przez referencję, więc nie wstawiaj tu złożonego wyrażenia zamiast zmiennej.
- execute wykonuje przygotowaną operację. W projekcie po sukcesie przekieruj wysyła 303 i kończy kod, aby odświeżenie strony panelu nie powtarzało INSERT.
Jak czytać pozostałe zapisy w pełnym przykładzie
| Zapis | Znaczenie | Przykład użycia |
|---|---|---|
wymagajPost() | Nasza funkcja: sprawdza metodę POST oraz CSRF; przy błędzie przerywa odpowiedź z405/403. | wymagajPost(); |
wymagajLogowania() | Nasza funkcja: oddaje int ID konta z sesji lub przekierowuje do logowania. | $id = wymagajLogowania(); |
przekieruj($adres) | Nasza funkcja wysyła Location ze statusem303 i kończy wykonanie przez exit. Typ wyniku never oznacza, że nie wraca do dalszej instrukcji. | przekieruj("/panel.php"); |
naglowek($tytul), stopka() | Nasze funkcje wypisujące wspólny HTML strony. void oznacza brak zwracanego wyniku do użycia w wyrażeniu. | naglowek("Katalog"); |
dirname(__DIR__) | dirname daje katalog nadrzędny; __DIR__ to katalog bieżącego pliku. W public prowadzi to do katalogu projektu, a dopisana ścieżka wskazuje src. | dirname(__DIR__)."/src/bootstrap.php" |
===, !==, &&, ||, ! | Identyczne, nieidentyczne, i, lub, zaprzeczenie. Porównanie ścisłe obejmuje typ; &&/|| nie sprawdzają drugiej części, gdy wynik jest już rozstrzygnięty. | $rok === false || $rok < 1888 |
-> oraz :: | -> wybiera właściwość lub metodę obiektu; :: odnosi się do elementu statycznego klasy. To nie jest zapis dostępu do tablicy. | $zapytanie->execute(); |
Sprawdź w działaniu
Zapisz rekord, nie fragment SQL — sprawdź w modelu
Model w przeglądarce wyjaśnia mechanizm na fikcyjnych danych. Nie wykonuje PHP ani zapytań SQL i nie tworzy kont. Prawdziwe skrypty uruchomisz lokalnie z paczki.
Przewidź rezultat, wykonaj próbę i wyjaśnij, która decyzja po stronie serwera decyduje o wyniku.
Uruchom krok po kroku
W gotowym projekcie lokalnie utwórz konto i zaloguj się — pełną budowę tego mechanizmu rozbieramy w lekcjach 14–16. Otwórz dodaj.php, zapisz film z apostrofem, sprawdź w panelu i phpMyAdmin. Rozdziel formularz, daneFilmu(), wymagajPost() i sam INSERT. Nie kopiuj starego wzorca składania zapytania z $_POST.
Plik wzorcowy: public/dodaj.php
<?php
require_once dirname(__DIR__).'/src/db.php';
require_once dirname(__DIR__).'/src/dane-filmu.php';
$idUzytkownika = wymagajLogowania();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
wymagajPost();
[$tytul, $rok, $gatunek, $cena] = daneFilmu($_POST);
$zapytanie = $polaczenie->prepare('INSERT INTO Filmy (tytul, rok, gatunek, cena_grosze, wlasciciel_id) VALUES (?, ?, ?, ?, ?)');
$zapytanie->bind_param('sisii', $tytul, $rok, $gatunek, $cena, $idUzytkownika);
$zapytanie->execute();
przekieruj('/panel.php');
}
naglowek('Dodaj film');
formularzFilmu([], '/dodaj.php');
stopka();
Pobierz i odtwórz projekt
W „Źródłach i materiałach” na końcu pobierz KINO / LAB.zip. Rozpakuj całość; instrukcja START.txt opisuje konfigurację. Pierwsze 6 przykładów w public/podstawy działa bez bazy. Dalsze wymagają lokalnej MariaDB 11.4, importu schema.sql i lokalnego konta bazy z minimalnymi prawami. Gotowa paczka pokazuje całość, ale w tej lekcji wykonaj opisane kroki i własne zadanie.
Ćwiczenie z pomocą · samodzielna praca
Twoja próba — podpowiedzi otwieraj po kolei
Dodaj dwa różne filmy, w tym tytuł O'Brien, z cenami w groszach. Wyślij też pusty tytuł i rok 0.
Dwa poprawne rekordy, błędne próby bez INSERT; autor zapisu pochodzi z sesji.
? Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź
Odszukaj wskazany plik i zapisz przewidywany rezultat przed zmianą.
Krok 2 — pokaż podpowiedź
Zmień jedną rzecz. Sprawdź metodę żądania, dane i odpowiedź lub wynik programu.
Krok 3 — pokaż podpowiedź
Wykonaj próbę graniczną lub błędną. Porównaj także stan bazy lub sesji, nie tylko komunikat.
Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.
Podsumowanie
Co warto zapamiętać
- Zapiszesz zweryfikowany film przez prepared statement oraz odczytasz rolę każdego parametru.
- Potrafisz wskazać w kodzie przyczynę wyniku i zaplanować próbę błędnych danych.
- Nie oddajesz haseł, pliku config.local.php ani wartości cookie.
Dalej na swoim koncie
Rozgrzewki, quiz i zadania są w biurku ucznia.
Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.
Zaloguj się →