Formulare zum Eintragen und Bearbeiten

Erste Schritte: Formulare zum Eintragen und Bearbeiten

In einer typischen PHP‑Anwendung brauchst du zwei Arten von Formularen:
Eintragen (neue Datensätze anlegen) und Bearbeiten (bestehende Datensätze ändern).
Dieses Tutorial zeigt dir einen kompakten Workflow, wie du beide Varianten mit möglichst wenig
Duplikat-Code umsetzt – inklusive Validierung und Vorbereitung für Prepared Statements.

1. Datenbank‑Grundlage

Als Beispiel nutzen wir eine Tabelle artikel mit den Spalten id,
titel und inhalt – ideal für Blog‑Posts, Notizen oder FAQ‑Einträge:

CREATE TABLE artikel (
    id INT AUTO_INCREMENT PRIMARY KEY,
    titel VARCHAR(100) NOT NULL,
    inhalt TEXT         NOT NULL,
    erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP
);

2. Formular – Eintragen (artikel_form.php)

Das gleiche Formular kann zum Anlegen und Bearbeiten dienen.
Wenn ?id=… in der URL steht, lädst du den vorhandenen Datensatz,
ansonsten bleibt alles leer für den Neueintrag.

<?php
/* 1) DB‑Verbindung */
$pdo = new PDO("mysql:host=localhost;dbname=deinedb;charset=utf8mb4", "user", "pass");

/* 2) Prüfen, ob eine ID mitgegeben wurde */
$id    = $_GET['id'] ?? null;
$titel = '';
$inhalt = '';

if ($id) {
    // Datensatz zum Bearbeiten holen
    $stmt = $pdo->prepare("SELECT titel, inhalt FROM artikel WHERE id = :id");
    $stmt->bindValue(':id', $id, PDO::PARAM_INT);
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($row) {
        $titel  = $row['titel'];
        $inhalt = $row['inhalt'];
    }
}
?>

<!-- 3) Formular: gleiches Markup für Neu + Edit -->
<form action="artikel_save.php" method="POST">
    <input type="hidden" name="id" value="<?= htmlspecialchars($id) ?>">

    <label>Titel:</label>
    <input type="text" name="titel" value="<?= htmlspecialchars($titel) ?>" required>

    <label>Inhalt:</label>
    <textarea name="inhalt" rows="6" required><?= htmlspecialchars($inhalt) ?></textarea>

    <button type="submit">
        <?= $id ? 'Aktualisieren' : 'Speichern' ?>
    </button>
</form>
  • Für Neueintrag bleibt $id leer → Hidden‑Input leer.
  • Für Bearbeiten füllst du $titel und $inhalt.

3. Formular verarbeiten (artikel_save.php)

Hier prüfst du die Eingaben, schützt dich vor XSS,
und unterscheidest, ob INSERT (neu) oder UPDATE (edit).

/* DB‑Connect */
$pdo = new PDO("mysql:host=localhost;dbname=deinedb;charset=utf8mb4", "user", "pass");

/* Eingaben holen & trimmen */
$id     = $_POST['id']     ?? null;
$titel  = trim($_POST['titel']  ?? '');
$inhalt = trim($_POST['inhalt'] ?? '');

$errors = [];

/* 1) Validieren */
if ($titel === '')  { $errors[] = 'Titel fehlt.';  }
if ($inhalt === '') { $errors[] = 'Inhalt fehlt.'; }

if ($errors) {
    foreach ($errors as $e) {
        echo "<li>" . htmlspecialchars($e) . "</li>";
    }
    echo '<a href="javascript:history.back()">Zurück</a>';
    exit;
}

/* 2) INSERT oder UPDATE */
if ($id) {
    // UPDATE
    $sql = "UPDATE artikel SET titel = :t, inhalt = :i WHERE id = :id";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':id', $id, PDO::PARAM_INT);
} else {
    // INSERT
    $sql = "INSERT INTO artikel (titel, inhalt) VALUES (:t, :i)";
    $stmt = $pdo->prepare($sql);
}
$stmt->bindValue(':t', $titel);
$stmt->bindValue(':i', $inhalt);
$stmt->execute();

/* 3) Redirect */
header("Location: artikel_list.php");
exit;

4. Liste aller Einträge & „Bearbeiten“-Link (artikel_list.php)

$pdo = new PDO("mysql:host=localhost;dbname=deinedb;charset=utf8mb4", "user", "pass");
$res = $pdo->query("SELECT id, titel, erstellt_am FROM artikel ORDER BY erstellt_am DESC");

echo '<a href="artikel_form.php">Neuen Artikel anlegen</a><hr>';

foreach ($res as $row) {
    echo '<strong>' . htmlspecialchars($row['titel']) . '</strong> ';
    echo '<a href="artikel_form.php?id=' . $row['id'] . '">Bearbeiten</a>';
    echo '<br><em>erstellt am ' . $row['erstellt_am'] . '</em><hr>';
}

5. Sicherheits‑Checkliste

  • Prepared Statements → SQL‑Injection verhindern
  • htmlspecialchars bei Ausgabe → XSS‑Schutz
  • Trim & Validierung → Pflichtfelder prüfen
  • Bei sensiblen Bereichen CSRF‑Token hinzufügen
  • Uploads? → Dateigröße, MIME‑Type, Speicherort kontrollieren

Fazit

Mit einem einzigen universellen Formular kannst du Eintragen und Bearbeiten abdecken:
Prüfe im GET‑Parameter, ob eine id existiert, fülle ggf. die Felder und unterscheide in der Verarbeitung zwischen INSERT und UPDATE.
Durch Prepared Statements, Validierung und klaren Redirect nach dem Speichern ist dein Workflow sicher und benutzerfreundlich.
Dieses Konzept kannst du leicht für jede andere Tabelle anpassen – egal ob Produkte, News‑Posts oder FAQ‑Einträge.