INF.03 · Bazy danych i SQL

Formularze i raporty: dane widziane oczami użytkownika

Sekretariat szkoły wypełnia formularz „nowy uczeń”, a w tle wykonuje się INSERT. Dyrektor otwiera „raport frekwencji”, a w tle działa gotowe zapytanie SELECT z GROUP BY. Użytkownicy nie znają SQL-a, a mimo to z niego korzystają. Dziś zobaczysz, jak połączyć wszystko, czego się nauczyłeś, w narzędzia dla ludzi: formularze i widoki.

  • około 35 minut
  • widoki (VIEW) · formularze HTML
  • bazy: sklep_muzyczny, apteka, FitZone

Po tej lekcji: zapiszesz raport jako widok, wyjaśnisz, czym widok różni się od tabeli, i napiszesz bezpieczny formularz, który dodaje dane do bazy.

1 · Trzy pojęcia

Kto wprowadza, kto czyta, kto zapamiętuje

Te trzy pojęcia dopełniają się. Formularz wprowadza dane, raport je zestawia, a widok zapisuje zapytanie raportu na stałe.

Formularzwejście

Interfejs, przez który użytkownik wpisuje dane. W tle trafiają do bazy poleceniem INSERT albo UPDATE.

Na przykład formularz „nowy uczeń”.

Raportwyjście

Zestawienie danych z bazy, zwykle wynik gotowego SELECT (często z JOIN i GROUP BY) w czytelnej formie.

Na przykład raport sprzedaży według produktów.

Widok (VIEW)zapisane zapytanie

Zapytanie zapisane w bazie pod nazwą. Wygląda jak tabela, ale nie przechowuje własnych danych.

Na przykład RaportSprzedazy.

2 · Sprawdź na danych

Widok zawsze pokazuje aktualny stan

To widok z raportem sprzedaży na prawdziwych zamówieniach ze sklepu muzycznego. Dodaj zamówienie i zobacz, że raport sam się zmienia. Potem spróbuj wpisać dane bezpośrednio do widoku.

Ta interakcja wymaga włączonego JavaScriptu.

Widok za każdym razem wykonuje zapisane zapytanie od nowa. Dlatego zawsze jest aktualny, ale nie możesz do niego swobodnie zapisywać danych jak do zwykłej tabeli.

3 · Raport w SQL

CREATE VIEW i odczyt jak z tabeli

Raport sprzedaży zapisujesz raz, a potem odpytujesz go tak, jak zwykłą tabelę. Nie musisz pamiętać ani przepisywać długiego zapytania.

widok.sqlsql
CREATE VIEW RaportSprzedazy AS
SELECT p.nazwa,
       SUM(z.ilosc) AS sztuk_sprzedanych,
       SUM(z.ilosc * p.cena) AS wartosc
FROM Zamowienia z
JOIN Produkty p ON z.id_produktu = p.id_produktu
GROUP BY p.nazwa;

SELECT * FROM RaportSprzedazy ORDER BY wartosc DESC LIMIT 3;
  1. CREATE VIEW ... AS zapisuje zapytanie pod nazwą. Same dane zostają w tabelach źródłowych.
  2. SELECT * FROM RaportSprzedazy wykonuje zapisane zapytanie na aktualnych danych.
  3. Aliasy AS nadają kolumnom raportu czytelne nagłówki.
nazwasztuk_sprzedanychwartosc
Gitara elektryczna24399.98
Kolumna aktywna33597.00
Keyboard edukacyjny11299.50
Wynik: trzy najwyższe wartości sprzedaży (przed dodaniem nowych zamówień).

4 · Formularz

Formularz HTML i polecenie, które za nim stoi

Formularz HTML jest tylko „powierzchnią”. Po kliknięciu „Zapisz” dane trafiają do skryptu po stronie serwera (na przykład w PHP), który dopiero wykonuje INSERT. Skrypt musi traktować wpisane dane jako dane, a nie jako fragment polecenia SQL.

formularz.htmlhtml
<form method="post" action="zapisz_klienta.php">
  <label>Imię <input name="imie" required></label>
  <label>Nazwisko <input name="nazwisko" required></label>
  <label>Miasto <input name="miasto" required></label>
  <label>E-mail <input name="email" type="email"></label>
  <button>Zapisz</button>
</form>
  1. required i type="email" to wstępna kontrola w przeglądarce. Nie zastępuje sprawdzania danych po stronie serwera, bo ktoś może wysłać dane bez formularza.
  2. Skrypt zapisz_klienta.php odbiera pola i wykonuje INSERT INTO Klienci (imie, nazwisko, miasto, email) VALUES (?, ?, ?, ?) z parametrami.

5 · Zanim się pomylisz

Cztery pomyłki w formularzach i raportach

Rozwiń każdą z nich.

Wklejanie danych użytkownika do SQL
Tak nie
$sql = "INSERT INTO Klienci (imie) VALUES ('" . $_POST['imie'] . "')";

Ktoś wpisze w polu imię fragment polecenia SQL i zmieni jego działanie (to atak SQL injection).

Tak
$stmt = $pdo->prepare("INSERT INTO Klienci (imie) VALUES (?)");
$stmt->execute([$_POST['imie']]);

Zapytanie z parametrami oddziela polecenie od danych.

Traktowanie widoku jak zwykłej tabeli
Tak nie
INSERT INTO RaportSprzedazy (nazwa) VALUES ('Mysz');

Błąd: The target table RaportSprzedazy of the INSERT is not insertable-into. Widok z GROUP BY nie przechowuje danych.

Tak
INSERT INTO Zamowienia (id_klienta, id_produktu, ilosc, data_zamowienia)
VALUES (1, 4, 5, '2026-03-11');

Dane dopisujesz do tabel źródłowych, a widok pokaże je sam.

Formularz bez walidacji po stronie serwera
Tak nie
Sprawdzam tylko `required` w HTML.

Kto wyśle żądanie z pominięciem formularza, zapisze błędne dane (pusty e-mail, zbyt długi tekst).

Tak
Serwer ponownie sprawdza każde pole, a baza pilnuje `NOT NULL`, `UNIQUE` i `CHECK`.

Walidacja w przeglądarce to wygoda, a walidacja na serwerze i w bazie to bezpieczeństwo.

Wiele prawie identycznych widoków
Tak nie
RaportSprzedazy2025, RaportSprzedazy2026, RaportSprzedazyMarzec…

Trudno je utrzymać. Zmiana wymaga poprawiania każdego z osobna.

Tak
Jedno zapytanie z parametrem (rok, miesiąc) po stronie aplikacji.

Jedno uniwersalne zapytanie jest łatwiejsze do utrzymania niż wiele kopii.

6 · Sprawdź sam siebie

Zanim oddasz raport lub formularz

Ta lekcja łączy SELECT, JOIN i GROUP BY w narzędzia, z których użytkownik końcowy korzysta bez znajomości SQL-a.

Podsumowanie

Co warto zapamiętać

  1. Formularz wprowadza dane (INSERT, UPDATE), raport je zestawia (SELECT).
  2. Widok to zapisane zapytanie. Nie przechowuje danych i zawsze pokazuje aktualny stan.
  3. Do widoku z GROUP BY nie zapiszesz danych. Zapisujesz je do tabel źródłowych.
  4. Dane z formularza przekazuj do bazy jako parametry, a nie doklejaj do tekstu SQL.
  5. Walidacja w przeglądarce nie zastępuje walidacji na serwerze.

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