Signatur
Beschreibung
mysqli_affected_rows() liefert die Anzahl der Datensätze, die durch das zuletzt ausgeführte DML-Statement (INSERT, UPDATE, REPLACE oder DELETE) tatsächlich verändert wurden. Bei SELECT-Abfragen verhält sich die Funktion wie mysqli_num_rows() und gibt die Anzahl der zurückgegebenen Zeilen an.
Der Rückgabewert ist im Normalfall ein int. Übersteigt die Anzahl der betroffenen Zeilen den maximalen Integer-Wert (PHP_INT_MAX), wird stattdessen ein string zurückgegeben. Ein Wert von -1 zeigt an, dass ein Fehler aufgetreten ist oder die Funktion im Kontext einer SELECT-Abfrage ohne vorherigen Aufruf von mysqli_store_result() verwendet wurde.
Besonders nützlich ist die Funktion, um nach einem UPDATE zu prüfen, ob wirklich Datensätze geändert wurden — etwa wenn ein Benutzer Daten abspeichert, die identisch mit den vorhandenen sind (MySQL meldet dann 0 betroffene Zeilen, obwohl die Abfrage erfolgreich war).
Die Funktion steht sowohl im prozeduralen Stil (mysqli_affected_rows($conn)) als auch objektorientiert über $mysqli->affected_rows zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Eine aktive MySQLi-Verbindungsressource, wie sie von mysqli_connect() oder new mysqli() zurückgegeben wird. |
Rückgabewert
Gibt die Anzahl der betroffenen Zeilen als int zurück. Bei mehr als PHP_INT_MAX betroffenen Zeilen wird ein string zurückgegeben. -1 signalisiert einen Fehler oder eine ungültige Abfrage. 0 bedeutet, dass keine Zeilen betroffen waren (z. B. bei einem UPDATE ohne Änderung oder ohne passende WHERE-Bedingung).
Beispiele
Zeilen nach einem UPDATE zählen
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$mysqli->query("UPDATE users SET status = 'active' WHERE last_login > '2024-01-01'");
$affected = mysqli_affected_rows($mysqli);
if ($affected === -1) {
echo 'Fehler bei der Abfrage.';
} elseif ($affected === 0) {
echo 'Keine Datensätze wurden geändert.';
} else {
echo "Es wurden {$affected} Datensätze aktualisiert.";
}
$mysqli->close();
Betroffene Zeilen nach einem DELETE prüfen
<?php
$mysqli = mysqli_connect('localhost', 'user', 'password', 'testdb');
if (!$mysqli) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
$userId = 7; // Beispiel-ID
$stmt = $mysqli->prepare('DELETE FROM sessions WHERE user_id = ? AND expires_at < NOW()');
$stmt->bind_param('i', $userId);
$stmt->execute();
$deleted = mysqli_affected_rows($mysqli);
echo "Abgelaufene Sessions gelöscht: {$deleted}";
$stmt->close();
$mysqli->close();
// Wichtig · Fallstricke
Wichtig bei UPDATE: MySQL zählt standardmäßig nur Zeilen, deren Werte sich tatsächlich geändert haben. Wenn also alle betroffenen Zeilen bereits den neuen Wert hatten, gibt mysqli_affected_rows() 0 zurück, obwohl die WHERE-Bedingung auf mehrere Zeilen gepasst hätte. Dieses Verhalten lässt sich durch das Verbindungs-Flag MYSQLI_CLIENT_FOUND_ROWS ändern — dann wird die Anzahl der gefundenen statt der geänderten Zeilen zurückgegeben.
Prepared Statements: Nach der Ausführung eines Prepared Statements via $stmt->execute() kann mysqli_affected_rows($mysqli) auf der Verbindung oder alternativ $stmt->affected_rows direkt auf dem Statement-Objekt verwendet werden.
Kein Ersatz für Fehlerprüfung: Ein Rückgabewert von 0 bedeutet nicht zwingend einen Fehler — er kann ein normales Ergebnis sein. Prüfe Fehler immer separat über $mysqli->errno bzw. $mysqli->error.