W3docs

affected_rows

Erläuterung der mysqli_affected_rows()-Funktion in PHP zur Ermittlung der Anzahl der von der letzten MySQL-Operation betroffenen Zeilen.

Die Funktion mysqli_affected_rows() zeigt an, wie viele Zeilen die letzte Schreiboperation tatsächlich verändert hat — also die Zeilen, die von dem zuletzt ausgeführten INSERT, UPDATE, DELETE oder REPLACE auf einer Verbindung betroffen wurden. Sie ist die Standardmethode, um zu bestätigen, dass eine Schreiboperation wie erwartet funktioniert hat: Hat das Update Zeilen gefunden? Hat das Delete etwas entfernt? Diese Seite behandelt die Syntax, die Rückgabewerte, den objektorientierten und den prozeduralen Stil, ein lauffähiges End-to-End-Beispiel sowie häufige Fallstricke.

Syntax

// Procedural style
mysqli_affected_rows(mysqli $mysql): int|string

// Object-oriented style (a read-only property, not a method call)
$mysqli->affected_rows

Das einzige Argument ist die MySQLi-Verbindung, mit der die Abfrage ausgeführt wurde — kein Ergebnissatz. Es gibt keine weiteren Parameter: Die Funktion gibt immer Auskunft über die zuletzt ausgeführte Anweisung auf dieser Verbindung.

Rückgabewert

RückgabeBedeutung
> 0Anzahl der durch INSERT, UPDATE, DELETE oder REPLACE geänderten Zeilen.
0Die Abfrage wurde erfolgreich ausgeführt, hat aber keine Zeilen gefunden oder geändert.
-1Die letzte Abfrage ist fehlgeschlagen oder es handelte sich um ein SELECT (verwende stattdessen mysqli_num_rows() auf dem Ergebnis).

Auf 64-Bit-Systemen kann die Anzahl PHP_INT_MAX überschreiten; in diesem Fall wird der Wert als numerischer string zurückgegeben — daher ist der Rückgabetyp int|string.

Achtung — "gefunden" vs. "geändert". Bei einem UPDATE zählt MySQL nur Zeilen, deren Werte tatsächlich geändert wurden, nicht Zeilen, die lediglich der WHERE-Klausel entsprachen. Das Setzen einer Spalte auf den bereits vorhandenen Wert zählt als 0 betroffene Zeilen. Um stattdessen gefundene Zeilen zu zählen, stelle die Verbindung mit dem Flag MYSQLI_CLIENT_FOUND_ROWS her.

Objektorientiert vs. prozedural

Beide Stile lesen denselben Wert; wähle einen und bleibe dabei. Beachte, dass affected_rows im OOP-Stil eine Eigenschaft ist, ohne Klammern:

<?php
// Object-oriented
$mysqli->query("DELETE FROM users WHERE active = 0");
echo $mysqli->affected_rows;        // property — no ()

// Procedural — same result
mysqli_query($link, "DELETE FROM users WHERE active = 0");
echo mysqli_affected_rows($link);   // function call

Ein vollständiges Beispiel

Dieses Skript stellt eine Verbindung her, führt ein UPDATE aus und gibt aus, wie viele Zeilen geändert wurden. Ersetze die Zugangsdaten durch deine eigenen.

<?php
$mysqli = new mysqli("localhost", "username", "password", "database");

if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    exit();
}

$mysqli->query("UPDATE users SET name = 'John' WHERE id = 1");
echo "Rows updated: " . mysqli_affected_rows($mysqli);

$mysqli->close();
?>

Wenn ein Benutzer mit id = 1 existiert und sein Name noch nicht John war, lautet die Ausgabe:

Rows updated: 1

Wenn kein Benutzer mit id = 1 vorhanden ist oder der Name bereits John war, lautet die Ausgabe Rows updated: 0. Siehe mysqli_query() für die Ausführung der Abfrage selbst und mysqli_connect() für die Verbindungsdetails.

Mit Prepared Statements

Wenn du Prepared Statements verwendest — die empfohlene Methode für Abfragen mit Benutzereingaben (siehe mysqli Prepared Statements) —, rufe affected_rows nach execute() auf der Verbindung auf, nicht auf dem Statement:

<?php
$stmt = $mysqli->prepare("UPDATE users SET name = ? WHERE id = ?");
$stmt->bind_param("si", $name, $id);
$name = "John";
$id   = 1;
$stmt->execute();

echo "Rows updated: " . $mysqli->affected_rows;  // read from the connection
$stmt->close();
?>

SELECT-Abfragen und veraltete Zähler

mysqli_affected_rows() ist für Schreib-Abfragen gedacht. Bei einem SELECT gibt sie -1 zurück; um Zeilen in einem Ergebnissatz zu zählen, verwende stattdessen mysqli_num_rows() auf dem Ergebnis. Vermeide das alte SQL_CALC_FOUND_ROWS / FOUND_ROWS()-Paar — es ist seit MySQL 8.0.17 veraltet und wurde in neueren Versionen entfernt. Führe eine separate COUNT(*)-Abfrage aus, wenn du einen Gesamtwert benötigst.

Verwandte Funktionen

Zusammenfassung

Verwende mysqli_affected_rows() (oder die OOP-Eigenschaft $mysqli->affected_rows) direkt nach einem INSERT, UPDATE, DELETE oder REPLACE, um die Schreiboperation zu überprüfen. Denke an die drei Rückgabewerte — eine positive Anzahl, 0 für keine Änderung und -1 für einen Fehler oder ein SELECT — sowie daran, dass ein UPDATE nur Zeilen zählt, deren Werte tatsächlich geändert wurden.

Übungen

Übung
Was macht die Funktion mysqli_affected_rows() in PHP?
Was macht die Funktion mysqli_affected_rows() in PHP?
Was this page helpful?