Start · Sprachen · PHP · Referenz · mysqli_affected_rows

mysqli_affected_rows

Funktion

Gibt die Anzahl der Zeilen zurück, die durch die zuletzt ausgeführte <code>INSERT</code>-, <code>UPDATE</code>-, <code>REPLACE</code>- oder <code>DELETE</code>-Abfrage betroffen wurden.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_affected_rows(mysqli $mysql): int|string

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

Typ
int|string
Beschreibung

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();
Es wurden 42 Datensätze aktualisiert.

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();
Abgelaufene Sessions gelöscht: 3

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