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()

insert.phpphp
<?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();
  1. prepare dostaje stały szablon. Każdy znak ? jest miejscem na jedną wartość; nie zapisuj go jako "?" w cudzysłowie SQL.
  2. sisii opisuje pięć wartości: string, int, string, int, int. s to tekst, i to liczba całkowita, d zmiennoprzecinkowa, b dane binarne.
  3. 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.
  4. 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

ZapisZnaczeniePrzykł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.

Ta interakcja wymaga włączonego JavaScriptu.

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

public/dodaj.phpphp
<?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.

Oczekiwany rezultat
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ć

  1. Zapiszesz zweryfikowany film przez prepared statement oraz odczytasz rolę każdego parametru.
  2. Potrafisz wskazać w kodzie przyczynę wyniku i zaplanować próbę błędnych danych.
  3. 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ę →
Źródła i dalsza nauka