Start · Sprachen · PHP · Referenz · mysql_affected_rows

mysql_affected_rows

Funktion

Liefert die Anzahl der Zeilen, die von der letzten <code>INSERT</code>-, <code>UPDATE</code>-, <code>REPLACE</code>- oder <code>DELETE</code>-Abfrage betroffen wurden.

seit PHP 4.0.0 Kategorie: db

Signatur

mysql_affected_rows(resource $link_identifier = NULL): int

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

Typ
int
Beschreibung
Gibt die Anzahl der betroffenen Datensätze als Integer zurück. Bei Fehler wird -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);
?>
Es wurden 5 stornierte Bestellungen gelöscht.

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);
?>
Preis wurde erfolgreich aktualisiert.

// 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.