MB Dev .tech
Registrieren Login

PHP + DB Praxis · CRUD Mini-App

← Zurück zu PHP + DB Praxis

In fast jeder Web-Anwendung gibt es die gleichen Grundfunktionen: Daten anlegen, anzeigen, bearbeiten und löschen. Genau dieses Muster nennt man CRUD.

Merke
CRUD = Create, Read, Update, Delete

Wenn du CRUD sicher beherrschst, kannst du schon sehr viele „echte“ Anwendungen bauen: Kontaktliste, Aufgabenliste, Inventar, Kundenverwaltung, Notizen, usw.

1) Beispiel-Projekt: Eine kleine Aufgabenliste

Damit es greifbar bleibt, nehmen wir als Beispiel eine einfache To-Do-Liste. Eine Aufgabe hat z.B.:

  • eine ID (z.B. 1, 2, 3 …)
  • einen Titel (z.B. „Einkaufen“)
  • einen Status (offen/erledigt)
  • ein Erstell-Datum

Wichtig: Wir bauen hier kein fertiges System, sondern erklären das Muster. Die Beispiele sind bewusst so geschrieben, dass du sie leicht auf andere Projekte übertragen kannst.

2) Datenbank-Grundlage: Eine Tabelle

Eine Mini-App startet oft mit einer einzigen Tabelle. So könnte eine tasks-Tabelle aussehen:

SQL (Beispiel-Tabelle)

CREATE TABLE tasks (
  id INT AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(120) NOT NULL,
  is_done TINYINT(1) NOT NULL DEFAULT 0,
  created_at DATETIME NOT NULL
);
Tipp
Starte klein

Am Anfang reichen wenige Spalten. Du kannst später immer erweitern (z.B. „Beschreibung“, „Priorität“, „Fälligkeitsdatum“).

3) CRUD als vier klare Aktionen

Damit du den roten Faden siehst, hier das Ziel als Übersicht:

  • Create: Neue Aufgabe speichern (INSERT)
  • Read: Aufgaben anzeigen (SELECT)
  • Update: Aufgabe ändern/abhaken (UPDATE)
  • Delete: Aufgabe entfernen (DELETE oder Soft Delete)
Merke
CRUD ist ein „Baukasten“

Viele Apps sind im Kern nur CRUD – plus Validierung, Rechte und ein bisschen UI.

4) Read: Eine Liste ausgeben (SELECT + foreach)

Die häufigste Ansicht ist eine Liste. Beispiel: alle Aufgaben, neueste zuerst. Wir nutzen Prepared Statements auch dann, wenn keine Parameter nötig wären – einfach, weil es ein sauberes Muster ist.

Read (Liste)

$sql = "
  SELECT id, title, is_done, created_at
  FROM tasks
  ORDER BY created_at DESC
";

$stmt = $pdo->prepare($sql);
$stmt->execute();

$tasks = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($tasks as $task) {
    echo $task['title'] . "<br>";
}
Tipp
Im Browser brauchst du HTML für schöne Ausgabe

<br> ist nur ein schneller Trick. Später würdest du z.B. eine Liste (<ul>) oder eine Tabelle bauen.

5) Create: Neue Aufgabe speichern (INSERT)

Beim Anlegen kommt meistens ein Wert aus einem Formular (z.B. $_POST['title']). Wir zeigen hier bewusst nur das Kernstück – Validierung kommt im nächsten Modul noch ausführlicher.

Create (INSERT)

$title = "Fenster putzen"; // Beispielwert

$sql = "
  INSERT INTO tasks (title, is_done, created_at)
  VALUES (:title, 0, NOW())
";

$stmt = $pdo->prepare($sql);
$stmt->execute([
    ':title' => $title,
]);

$newId = (int)$pdo->lastInsertId();
Merke
lastInsertId() liefert die neue ID

Sehr praktisch, wenn du nach dem Speichern direkt auf eine Detailseite weiterleiten willst oder eine Erfolgsmeldung anzeigen möchtest.

6) Update: Eine Aufgabe abhaken (UPDATE)

Update heißt: Ein vorhandener Datensatz wird geändert. Bei einer Aufgabenliste ist das typisch: „offen“ → „erledigt“.

Update (Status ändern)

$taskId = 3;   // Beispiel: welche Aufgabe?
$isDone = 1;   // 1 = erledigt, 0 = offen

$sql = "UPDATE tasks SET is_done = :done WHERE id = :id";

$stmt = $pdo->prepare($sql);
$stmt->execute([
    ':done' => $isDone,
    ':id'   => $taskId,
]);
Achtung
UPDATE ohne WHERE ist gefährlich

Ohne WHERE würdest du sonst alle Aufgaben ändern. Das ist einer der häufigsten und teuersten SQL-Fehler.

7) Delete: Eine Aufgabe löschen

„Delete“ kann zwei Bedeutungen haben: hart löschen (Datensatz ist weg) oder soft löschen (Datensatz bleibt, aber gilt als gelöscht). Soft Delete behandeln wir im eigenen Modul noch genauer.

Delete (hart)

$taskId = 3;

$sql  = "DELETE FROM tasks WHERE id = :id";
$stmt = $pdo->prepare($sql);

$stmt->execute([
    ':id' => $taskId,
]);
Achtung
Hartes Löschen ist endgültig

Wenn du später „Wiederherstellen“ oder „Audit/Logs“ brauchst, ist Soft Delete oft die bessere Wahl.

Kleine Aufgaben (zum Mitdenken)

Erst überlegen – dann Lösung aufklappen.

Aufgabe 1: Warum ist WHERE so wichtig?

Überlege: Was würde passieren, wenn du beim Update das WHERE id = ... weglässt?

Lösung einblenden
Lösung
Du würdest alle Datensätze ändern

Ohne WHERE gilt das Update für jede Zeile der Tabelle. Das ist fast nie gewollt.

Aufgabe 2: Create + Read kombinieren

Überlege: Welche zwei CRUD-Aktionen brauchst du, um nach dem Speichern sofort wieder die Liste zu zeigen?

Lösung einblenden
Lösung
Create und danach Read

Erst INSERT (Create), danach SELECT (Read), um die aktualisierte Liste zu rendern.