Dataczwartek, 13 sierpnia 2026 Czas19:00:03
← Aplikacje internetowe (PHP)

Lekcja 12. Edycja i usuwanie danych przez PHP — pełny CRUD

Trudny / egzaminacyjny

Po co się tego uczymy?

Panel administratora bez możliwości poprawienia literówki w tytule filmu albo usunięcia nieaktualnej pozycji byłby bezużyteczny. Ta lekcja domyka komplet operacji, jakich potrzebuje KAŻDA prawdziwa aplikacja internetowa oparta na bazie danych.

Teoria

CRUD to skrót od czterech podstawowych operacji na danych: Create (dodaj — Lekcja 10), Read (odczytaj — Lekcja 11), Update (zmień) i Delete (usuń). Teraz dokończysz komplet.

Edycja i usuwanie ZAWSZE potrzebują identyfikatora konkretnego wiersza (id_filmu, id_klienta...) — inaczej baza nie wie, KTÓRY rekord zmienić albo usunąć. Ten identyfikator najczęściej przekazuje się przez adres URL jako parametr GET, np. edytuj.php?id=5, a w PHP odbiera przez $_GET["id"].

Bardzo ważna zasada, znana już z lekcji o DML: UPDATE i DELETE bez warunku WHERE zmienią/usuną WSZYSTKIE wiersze tabeli. W PHP ta zasada obowiązuje dokładnie tak samo — zawsze buduj zapytanie z WHERE id = konkretna_wartosc.

Schemat

CREATE  -> INSERT INTO ...           (Lekcja 10)
READ    -> SELECT ... FROM ...       (Lekcja 11)
UPDATE  -> UPDATE ... SET ... WHERE id = ...
DELETE  -> DELETE FROM ... WHERE id = ...

Razem: CRUD = Create, Read, Update, Delete

Przykład z życia

Panel administracyjny serwisu filmowego: obok każdego filmu na liście (z Lekcji 11) są dwa linki/przyciski — "Edytuj" i "Usuń" — każdy z nich przekazuje id_filmu do odpowiedniego skryptu PHP, który wykonuje UPDATE albo DELETE dokładnie na tym jednym wierszu.

Kod (PHP)

<?php
$polaczenie = mysqli_connect("localhost", "root", "", "serwis_filmowy");

// USUWANIE - np. wywołane linkiem usun.php?id=5
if (isset($_GET["usun"])) {
    $id = (int) $_GET["usun"];
    $zapytanie = "DELETE FROM Filmy WHERE id_filmu = $id";
    mysqli_query($polaczenie, $zapytanie);
    echo "Film o id $id został usunięty.<br>";
}

// EDYCJA - formularz wysyła nowy tytuł i id filmu do zmiany
if (isset($_POST["id_filmu"]) && isset($_POST["nowyTytul"])) {
    $id = (int) $_POST["id_filmu"];
    $nowyTytul = mysqli_real_escape_string($polaczenie, $_POST["nowyTytul"]);

    $zapytanie = "UPDATE Filmy SET tytul = '$nowyTytul' WHERE id_filmu = $id";

    if (mysqli_query($polaczenie, $zapytanie)) {
        echo "Film zaktualizowany.<br>";
    } else {
        echo "Błąd aktualizacji: " . mysqli_error($polaczenie);
    }
}

mysqli_close($polaczenie);

Komentarz i wyjaśnienie kodu

W obu operacjach rzutujemy $_GET["usun"] i $_POST["id_filmu"] na (int) — to ważne zabezpieczenie: nawet gdyby ktoś wpisał w adresie usun.php?usun=5; DROP TABLE Filmy, rzutowanie na int zamieni to na samo "5", ignorując resztę. To jeden z prostych, ale skutecznych elementów ochrony przed SQL injection (więcej w Lekcji 19). Zwróć uwagę, że UPDATE i DELETE mają WHERE id_filmu = $id — bez tego warunku zmieniłyby/usunęłyby WSZYSTKIE filmy w tabeli.

Ćwiczenie samodzielne

Dodaj do formularza edycji drugie pole — rok_produkcji — i zaktualizuj zapytanie UPDATE, żeby zmieniało obie kolumny naraz.

Zadania do pracy własnej

  1. Napisz skrypt usuwający klienta z tabeli Klienci na podstawie id przekazanego przez $_GET.

  2. Napisz formularz i skrypt do edycji ceny wypożyczenia filmu (formularz ma ukryte pole z id_filmu i widoczne pole z nową ceną).

  3. Zbuduj kompletny mini-panel do zarządzania filmami: lista filmów z Lekcji 11, przy każdym link "Usuń" (z potwierdzeniem przez JavaScript confirm(), jeśli już to znasz) oraz link "Edytuj" prowadzący do osobnego formularza wypełnionego aktualnymi danymi filmu (podpowiedź: najpierw SELECT jednego filmu po id, potem wypełnij nim value= pól formularza).

Typowe błędy

Najpoważniejszy błąd to UPDATE albo DELETE bez WHERE — usunie/zmieni to WSZYSTKIE wiersze tabeli naraz. Drugi błąd: przekazanie id jako tekstu bez rzutowania na (int), co przy nieostrożnym budowaniu zapytania otwiera furtkę na SQL injection. Trzeci: zapomnienie, że formularz edycji potrzebuje UKRYTEGO pola z id edytowanego rekordu () — bez tego PHP nie wie, KTÓRY wiersz zmienić.

Nawiązanie do egzaminu zawodowego

To dopełnienie efektu INF.03.5.4 w pełnym zakresie — kompletna aplikacja z operacjami CRUD to jeden z najbardziej rozbudowanych, ale i najczęściej ocenianych elementów części praktycznej egzaminu INF.03 przy zadaniach z aplikacją webową korzystającą z bazy danych.