W3docs

Umfassender Leitfaden zum Aktualisieren von Daten in einer MySQL-Datenbank mit PHP

Lernen Sie, wie Sie Daten in einer MySQL-Datenbank mit PHP sicher aktualisieren – mit Prepared Statements und bewährten Methoden.

Das Aktualisieren von Daten ist eine der vier grundlegenden Datenbankoperationen (neben dem Einfügen, Auswählen und Löschen von Zeilen). Jede Anwendung, die es Benutzern ermöglicht, ein Profil zu bearbeiten, eine Aufgabe als erledigt zu markieren oder einen Preis zu ändern, setzt darauf. Dieses Kapitel zeigt, wie man eine UPDATE-Abfrage in PHP sicher ausführt — mit Prepared Statements — und wie man genau nachvollzieht, wie viele Zeilen geändert wurden.

Dieses Kapitel setzt voraus, dass Sie bereits eine funktionierende Datenbankverbindung besitzen. Die Beispiele verwenden mysqli; eine gleichwertige PDO-Version ist am Ende enthalten.

Die PHP-MySQL-UPDATE-Syntax verstehen

Die UPDATE-Anweisung ändert die Werte vorhandener Zeilen. Ihre Struktur ist dieselbe, egal ob Sie sie in der MySQL-Konsole oder in PHP ausführen:

UPDATE table_name
SET column1 = value1, column2 = value2
WHERE some_column = some_value;
  • table_name — die Tabelle, deren Zeilen Sie ändern möchten.
  • SET — die zu ändernden Spalten und ihre neuen Werte. Spalten, die nicht aufgeführt sind, bleiben unverändert.
  • WHERE — welche Zeilen geändert werden sollen. Diese Klausel ist entscheidend. Wenn Sie sie weglassen, wird jede Zeile in der Tabelle aktualisiert.

Der häufigste — und schädlichste — UPDATE-Fehler ist das Vergessen der WHERE-Klausel. UPDATE users SET active = 0 deaktiviert jeden Benutzer in der Tabelle, nicht nur einen. Überprüfen Sie stets die WHERE-Bedingung, bevor Sie ein Update auf echten Daten ausführen.

Daten mit einem Prepared Statement aktualisieren

Erstellen Sie niemals eine UPDATE-Abfrage, indem Sie Benutzereingaben direkt in den SQL-String einfügen — das macht Sie anfällig für SQL-Injection. Verwenden Sie stattdessen ein Prepared Statement: Schreiben Sie die Abfrage mit ?-Platzhaltern und binden Sie die Werte dann separat, damit die Datenbank sie strikt als Daten behandelt.

<?php
// Reuse your connection — in practice: require 'db_connect.php';
$conn = mysqli_connect("localhost", "username", "password", "database_name");

if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql  = "UPDATE users SET email = ?, age = ? WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);

$email = "[email protected]";
$age   = 31;
$id    = 1;

// Type string: s = string, i = integer, d = double, b = blob.
// One letter per placeholder, in order.
mysqli_stmt_bind_param($stmt, "sii", $email, $age, $id);

if (mysqli_stmt_execute($stmt)) {
    echo "Record updated successfully";
} else {
    echo "Error updating record: " . mysqli_stmt_error($stmt);
}

mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

So funktioniert es Schritt für Schritt:

  1. mysqli_prepare() sendet die Abfragevorlage (mit ?-Platzhaltern) an MySQL.
  2. mysqli_stmt_bind_param() bindet Ihre PHP-Variablen an diese Platzhalter. Das erste Argument, "sii", deklariert den Typ jedes Wertes der Reihe nach: ein string, dann zwei integer. Die Anzahl und Reihenfolge der Buchstaben muss genau mit den Platzhaltern übereinstimmen.
  3. mysqli_stmt_execute() führt die Abfrage aus und gibt bei Erfolg true und bei Fehler false zurück.

Überprüfen, wie viele Zeilen geändert wurden

Dass mysqli_stmt_execute() true zurückgibt, bedeutet nur, dass die Abfrage ohne Fehler ausgeführt wurde — es bedeutet nicht, dass tatsächlich eine Zeile geändert wurde. Wenn die WHERE-Bedingung keine Zeilen gefunden hat (oder die neuen Werte mit den alten identisch waren), sind null Zeilen betroffen. Verwenden Sie mysqli_stmt_affected_rows(), um das herauszufinden:

<?php
$conn = mysqli_connect("localhost", "username", "password", "database_name");

$sql  = "UPDATE users SET age = ? WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);

$age = 40;
$id  = 1;
mysqli_stmt_bind_param($stmt, "ii", $age, $id);
mysqli_stmt_execute($stmt);

$rows = mysqli_stmt_affected_rows($stmt);
if ($rows > 0) {
    echo "Updated {$rows} row(s).";
} else {
    echo "No row matched, or the value was already up to date.";
}

mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

Dieser Unterschied ist in echten Anwendungen wichtig: Ein „Speichern"-Button, der Erfolg meldet, obwohl nichts gefunden wurde, kann Fehler vor Ihren Benutzern verbergen.

Daten mit PDO aktualisieren

PDO ist die portablere Alternative zu mysqli — derselbe Code funktioniert für MySQL, PostgreSQL, SQLite und andere. Benannte Platzhalter machen längere Abfragen leichter lesbar:

<?php
$pdo = new PDO(
    "mysql:host=localhost;dbname=database_name;charset=utf8mb4",
    "username",
    "password",
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);

$stmt = $pdo->prepare(
    "UPDATE users SET email = :email, age = :age WHERE id = :id"
);

$stmt->execute([
    ':email' => '[email protected]',
    ':age'   => 31,
    ':id'    => 1,
]);

echo "Updated " . $stmt->rowCount() . " row(s).";
?>

Mit gesetztem PDO::ERRMODE_EXCEPTION wirft eine fehlgeschlagene Abfrage eine Exception, die Sie abfangen können, anstatt still zu scheitern. rowCount() ist das PDO-Äquivalent zu mysqli_stmt_affected_rows().

Best Practices

  • Fügen Sie immer eine WHERE-Klausel ein, es sei denn, Sie möchten wirklich jede Zeile aktualisieren.
  • Verwenden Sie Prepared Statements für jeden Wert, der von Benutzereingaben stammt — niemals String-Verkettung.
  • Stimmen Sie den Bind-Typ-String ("sii" usw.) mit den tatsächlichen Typen Ihrer Variablen ab, um stille Konvertierungen zu vermeiden.
  • Fassen Sie Aktualisierungen mehrerer Tabellen in einer Transaktion zusammen, damit sie entweder alle erfolgreich sind oder alle zurückgerollt werden.
  • Sichern Sie wichtige Daten, bevor Sie umfangreiche oder einmalige Aktualisierungen in der Produktionsumgebung durchführen.

Übung

Übung
Was ist beim Aktualisieren von Daten mit PHP in MySQL zu beachten?
Was ist beim Aktualisieren von Daten mit PHP in MySQL zu beachten?
Was this page helpful?