Daten aktualisieren per UPDATE
Daten lassen sich in MySQL aktualisieren mittels der UPDATE-Anweisung . Ähnlich wie bei WHERE können wir hier wieder die gleichen Anweisungen nutzen um zu spezifizieren, welche Einträge geändert werden sollen.
Inhaltsverzeichnis
Update einer einzelnen Zeile
Möchte ihr eine einzelne Zeile in eurer Tabelle aktualisieren, so könnt ihr auf das Id-Feld zurückgreifen. Jeder Eintrag besitzt eine eindeutige Id, also könnt ihr ganz bewusst diesen Eintrag verändern:
1 2 3 4 5 6 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("UPDATE users SET email = ? WHERE id = ?"); ?> |
In diesem Beispiel wird die Tabelle users aktualisiert. Dabei wird das Feld email aktualisiert auf einen noch zu bestimmenden Wert (deswegen der Platzhalter) und zwar für alle Einträge mit einer gewissen Id. Mittels execute() wird dieses prepared Statement ausgeführt und es werden die konkreten Daten übergeben. In diesem Fall wird der Eintrag mit der Id 1 aktualisiert und für diesen wird die E-Mail-Adresse [email protected] gesetzt.
Natürlich könnt ihr die Parameter, wie bei allen prepared Statements, auch wieder benennen:
1 2 3 4 5 6 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("UPDATE users SET email = :email_neu WHERE id = :id"); ?> |
Im obigen Fall haben wir die Id als ein Parameter definiert. Natürlich können wir auch eine feste Id in den Query einspeichern, z.B. wenn wir stets den Eintrag mit der Id 1 verändern wollen:
1 2 3 4 5 6 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("UPDATE users SET email = :email_neu WHERE id = 1"); ?> |
Achtung: Sofern euer Update von Benutzereingaben abhängt, z.B. ihr wollt die E-Mail-Adresse eines Nutzers mit einer gewissen Id aktualisieren, dann solltet ihr diese Id stets als Parameter für execute($data) übergeben und es nicht in das SQL-Statement reinschreiben. Dies können Angreifer ausnutzen und so unter Umständen mittels SQL-Injections sensible Daten aus eurer Datenbank stehlen oder manipulieren.
Mehrere Einträge aktualisieren
Das definieren der WHERE-Klausel ist für UPDATE optional. Wenn ihr diese weglasst, dann werden alle Einträge aktualisiert. Um die Email aller Benutzer zu verändern, könnt ihr z.B. folgenden Befehl ausführen:
1 2 3 4 5 6 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("UPDATE users SET email = :email_neu"); ?> |
In den meisten Fällen wollt ihr aber nur gewisse Einträge aktualisieren. Statt einem einzelnen Eintrag könnt ihr mittels der WHERE-Anweisung auch beliebige Kriterien vorgeben, welche Datensätze aktualisiert werden sollen. Um die E-Mail-Adressen von allen Einträgen mit Vorname Max zu aktualisieren, könnt ihr folgende Anweisung nutzen:
1 2 3 4 5 6 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("UPDATE users SET email = :email_neu WHERE vorname = :vorname"); ?> |
Auch könnt ihr mittels AND und OR komplexere Abfragen zusammensetzen, identisch wie es im Artikel Komplexere Datenabfrage per SELECT beschrieben ist:
1 2 3 4 5 6 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("UPDATE users SET email = :email_neu WHERE vorname = :vorname AND nachname = :nachname"); $statement->execute(array('email_neu' => '[email protected]', 'vorname' => 'Max', 'nachname' => 'Mustermann')); ?> |
Mehrere Felder aktualisieren
Bisher wurde immer nur ein Feld aktualisieren. Um mehrere Felder zu aktualisieren, könnt ihr entweder mehrere SQL-Anweisungen schreiben, oder alles in eine. Dazu führt ihr im SET-Teil alle Spalten und Werte ein (per Komma getrennt), die ihr aktualisieren wollt.
1 2 3 4 5 6 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("UPDATE users SET vorname = :vorname_neu, email = :email_neu, nachname = :nachname_neu WHERE id = :id"); $statement->execute(array('id' => 1, 'email_neu' => '[email protected]', 'vorname_neu' => 'Neuer Vorname', 'nachname_neu' => 'Neuer Nachname')); ?> |
Auf andere Felder verweisen
In der UPDATE-Anweisung könnt ihr auf die Werte anderer Felder zugreifen, so kann man beispielsweise sehr einfach einem Feld den Wert eines anderen zuweisen. Auch lassen sich so die Werte eines Felds erhöhen. Möchte ihr z.B. die Anzahl der Logins von einem User erhöhen, so muss dieses Feld jeweils um den Wert 1 erhöht werden. Dies kann MySQL direkt für euch erledigen.
Im folgenden setzt ihr für den User 1 den Wert für vorname gleich dem Wert von nachname:
1 2 3 4 5 6 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("UPDATE users SET vorname = nachname WHERE id = :id"); $statement->execute(array('id' => 1)); ?> |
Dies ist in diesem Fall nicht besonders sinnvoll, aber es gibt häufig Fälle in denen das nützlich sein kann. Beispielsweise fügt ihr noch eine weitere Spalte in eure bestehende Tabelle ein, z.B. die E-Mail-Adresse bei der Registrierung (die aktuelle E-Mail Adresse kann sich ja verändern). Um dann für alle Einträge die bestehende E-Mail-Adresse zu übernehmen, könnt ihr folgende Anweisung ausführen:
[code]
UPDATE users SET email_registration=email
[/code]
Schon wird für alle Benutzer der Wert in dem Feld email_registration gleich dem Wert der Spalte email gesetzt.
Felder inkrementieren
Es lassen sich in MySQL auch sehr einfach die Werte von Feldern erhöhen oder verkleinern. Möchtet ihr z.B. die Anzahl der Logins protokollieren, so müsst ihr einfach folgenden Befehl bei jedem Login ausführen:
1 2 3 4 5 6 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("UPDATE users SET anzahl_logins = anzahl_logins+1 WHERE id = :id"); $statement->execute(array('id' => 1)); ?> |
Hier wird für den User 1 das Feld anzahl_logins aktualisiert, und zwar auf den Wert anzahl_logins+1. Das heißt, danach ist der Wert in dem Feld um 1 größer. Ihr könnt dort ziemlich beliebige mathematische Operationen durchführen, mit anzahl_logins-1 würde der Wert immer kleiner werden, mit anzahl_logins*2 würde sich der Wert verdoppeln und mit anzahl_logins*anzahl_logins würdet ihr das Quadrat berechnen.
Felder sortieren und Anzahl der Felder begrenzen
Identisch zu SELECT-Anweisungen können wir bei UPDATE ebenfalls ORDER BY und LIMIT verwenden. Möchten wir beispielsweise die Benutzer mit den 10 kleinsten IDs aktualisieren, geht dies wie folgt:
1 2 3 4 5 6 |
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $statement = $pdo->prepare("UPDATE users SET vorname = :vorname_neu ORDER BY id LIMIT 10"); $statement->execute(array('vorname_neu' => 'Neuer Vorname')); ?> |