Signatur
Beschreibung
mysql_affected_rows() gibt die Anzahl der Datensätze zurück, die durch die zuletzt ausgeführte schreibende SQL-Abfrage (z. B. INSERT, UPDATE, DELETE, REPLACE) auf der angegebenen MySQL-Verbindung verändert wurden. Die Funktion ist nützlich, um nach einer Datenbankoperation zu prüfen, ob und wie viele Zeilen tatsächlich betroffen waren.
Bei UPDATE-Abfragen wird nur die Anzahl der Zeilen gezählt, deren Werte sich tatsächlich geändert haben. Zeilen, die zwar in der WHERE-Bedingung zutrafen, aber bereits den neuen Wert besaßen, werden nicht mitgezählt. Bei DELETE-Anweisungen ohne WHERE-Klausel (Löschen aller Zeilen) kann der Rückgabewert 0 sein, da MySQL intern eine schnelle Tabellen-Kürzung vornimmt.
Wird kein $link_identifier übergeben, wird die zuletzt geöffnete Verbindung verwendet. Bei SELECT-Abfragen liefert die Funktion keinen sinnvollen Wert — hierfür sollte stattdessen mysql_num_rows() verwendet werden.
Achtung: Die gesamte mysql_*-Erweiterung ist seit PHP 5.5.0 als veraltet markiert und wurde in PHP 7.0.0 vollständig entfernt. Für neue Projekte sollten stattdessen mysqli_affected_rows() oder die PDO-Methode PDOStatement::rowCount() verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $link_identifier | resource | NULL | Eine MySQL-Verbindungsressource, wie sie von mysql_connect() zurückgegeben wird. Wird der Parameter weggelassen, wird die zuletzt geöffnete Verbindung verwendet. Existiert keine offene Verbindung, versucht PHP automatisch eine Verbindung herzustellen, als wäre mysql_connect() ohne Argumente aufgerufen worden. |
Rückgabewert
-1 zurückgegeben. Wurden keine Zeilen betroffen, ist der Rückgabewert 0.Beispiele
Anzahl gelöschter Datensätze ermitteln
<?php
$link = mysql_connect('localhost', 'benutzer', 'passwort');
mysql_select_db('meine_datenbank', $link);
$result = mysql_query("DELETE FROM bestellungen WHERE status = 'storniert'", $link);
if ($result) {
$anzahl = mysql_affected_rows($link);
echo "Es wurden $anzahl stornierte Bestellungen gelöscht.";
} else {
echo "Fehler bei der Abfrage: " . mysql_error($link);
}
mysql_close($link);
?>
UPDATE-Prüfung: Hat sich wirklich etwas geändert?
<?php
$link = mysql_connect('localhost', 'benutzer', 'passwort');
mysql_select_db('meine_datenbank', $link);
$neuer_preis = 29.99;
$produkt_id = 42;
mysql_query(
"UPDATE produkte SET preis = $neuer_preis WHERE id = $produkt_id",
$link
);
$betroffene = mysql_affected_rows($link);
if ($betroffene > 0) {
echo "Preis wurde erfolgreich aktualisiert.";
} elseif ($betroffene === 0) {
echo "Kein Datensatz geändert (Preis war bereits $neuer_preis oder Produkt nicht gefunden).";
} else {
echo "Fehler bei der Aktualisierung.";
}
mysql_close($link);
?>
// Wichtig · Fallstricke
Deprecation-Hinweis: Die mysql_*-Erweiterung ist seit PHP 5.5.0 offiziell als veraltet markiert (deprecated) und wurde in PHP 7.0.0 vollständig aus dem Sprachkern entfernt. Code, der diese Funktion verwendet, ist auf modernen PHP-Installationen nicht mehr lauffähig. Migriere auf mysqli_affected_rows() (prozedurale Schnittstelle) oder PDOStatement::rowCount() (PDO).
Sicherheit: Die alten mysql_*-Funktionen unterstützen keine Prepared Statements, was sie anfällig für SQL-Injection macht. Beim Migrieren unbedingt auf vorbereitete Anweisungen (mysqli_prepare() oder PDO::prepare()) umstellen.
Randfälle: Bei TRUNCATE TABLE gibt die Funktion 0 zurück, da MySQL diese Operation intern nicht als zeilenweises Löschen behandelt. Bei Verwendung mehrerer Verbindungen immer explizit den korrekten $link_identifier übergeben, um unerwartete Ergebnisse zu vermeiden.