Operacje CRUD w PHP i MySQL

INF.03.7 (2) — Pełny cykl życia danych w aplikacji

Definicja CRUD (Create, Read, Update, Delete)

CRUD to akronim opisujący cztery podstawowe operacje, które można wykonać na danych w systemie zarządzania bazą danych. Umiejętność ich implementacji to podstawa tworzenia każdej dynamicznej aplikacji internetowej.

  • **C (Create):** Tworzenie nowego rekordu (SQL: `INSERT`)
  • **R (Read):** Odczyt danych (SQL: `SELECT`)
  • **U (Update):** Modyfikacja istniejącego rekordu (SQL: `UPDATE`)
  • **D (Delete):** Usuwanie rekordu (SQL: `DELETE`)
**Bezpieczeństwo!** Wszystkie przykłady poniżej wykorzystują **Prepared Statements (Przygotowane Zapytania)** z PDO. Jest to jedyny akceptowalny sposób na przesyłanie danych z formularza do bazy, gdyż automatycznie chroni przed SQL Injection.

C CREATE (Dodawanie Danych)

Instrukcja `INSERT` służy do dodawania nowych wierszy do tabeli. Dane pochodzą zazwyczaj z formularza przetworzonego przez `$_POST`.

SQL: INSERT

INSERT INTO uzytkownicy (imie, email, haslo_hash)
VALUES (:imie, :email, :haslo);

Implementacja PHP (PDO Prepared Statement)

<?php
// Zakładamy, że $pdo jest połączony
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['imie'])) {
    $imie = $_POST['imie'];
    $email = $_POST['email'];

    $sql = "INSERT INTO uzytkownicy (imie, email) VALUES (?, ?)";
    $stmt = $pdo->prepare($sql);
    // Wykonanie zapytania z danymi z formularza
    $stmt->execute([$imie, $email]);

    echo "Dodano nowego użytkownika.";
}
?>

R READ (Odczyt Danych)

Instrukcja `SELECT` służy do pobierania danych. W kontekście CRUD zazwyczaj używamy jej do wyświetlenia wszystkich rekordów lub pojedynczego rekordu (np. na stronie szczegółów).

SQL: SELECT (Odczyt pojedynczy)

SELECT * FROM produkty WHERE id = :id;

Implementacja PHP (PDO)

<?php
    $id_produktu = 5;

    $sql = "SELECT nazwa, cena FROM produkty WHERE id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$id_produktu]);
    $produkt = $stmt->fetch();

    if ($produkt) {
        echo "Nazwa: {$produkt['nazwa']}, Cena: {$produkt['cena']} zł";
    } else {
        echo "Nie znaleziono produktu.";
    }
?>

U UPDATE (Modyfikacja Danych)

Instrukcja `UPDATE` służy do zmiany wartości w istniejących wierszach. **Kluczowe jest użycie klauzuli `WHERE`, aby określić, który rekord ma zostać zmieniony (zazwyczaj przez jego ID).**

SQL: UPDATE

UPDATE ksiazki SET tytul = :nowy_tytul, autor = :nowy_autor
WHERE id = :id_ksiazki;

Implementacja PHP (PDO Prepared Statement)

<?php
    $nowy_tytul = "Wiedźmin: Ostatnie Życzenie";
    $id_ksiazki = 10;

    $sql = "UPDATE ksiazki SET tytul = ? WHERE id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$nowy_tytul, $id_ksiazki]);

    echo "Zaktualizowano {$stmt->rowCount()} rekordów.";
?>

D DELETE (Usuwanie Danych)

Instrukcja `DELETE` służy do trwałego usuwania wierszy. Podobnie jak w `UPDATE`, klauzula `WHERE` jest niezbędna, aby uniknąć usunięcia całej zawartości tabeli!

SQL: DELETE

DELETE FROM logi WHERE data < NOW() - INTERVAL 30 DAY;

Implementacja PHP (PDO Prepared Statement)

<?php
    // ID użytkownika do usunięcia, np. przekazane przez GET
    $id_do_usuniecia = $_GET['user_id'] ?? 0;

    // Ważne! WHERE musi być zawsze użyte z ID.
    $sql = "DELETE FROM uzytkownicy WHERE id = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$id_do_usuniecia]);

    if ($stmt->rowCount() > 0) {
        echo "Pomyślnie usunięto użytkownika ID: $id_do_usuniecia.";
    } else {
        echo "Nie znaleziono użytkownika do usunięcia.";
    }
?>

Ćwiczenie Zadania Praktyczne (Pełny CRUD)

Zadanie 1: Dodawanie i Odczyt (CREATE & READ)

Utwórz aplikację do dodawania zadań (ToDo) do tabeli zadania (id INT, opis VARCHAR).

Zadanie 2: Aktualizacja i Usuwanie (UPDATE & DELETE - Ponadpodstawowe)

Rozbuduj aplikację ToDo o możliwość modyfikacji i usuwania.

Materiały Narzędzia i Linki

  • **PHP Manual PDO:** Prepared Statements (Konieczna lektura dla bezpieczeństwa).
  • **SQL CRUD:** Wyszukaj "SQL INSERT UPDATE DELETE examples" dla przypomnienia składni SQL.
  • **Bezpieczeństwo:** Zawsze traktuj `$_GET` i `$_POST` jako niezaufane dane.
Materiały: Operacje CRUD w PHP i MySQL · Opracowanie na podstawie wymagań INF.03 | Autor: Tomasz Puchała (toloki.pl)