Start · Sprachen · PHP · Referenz · mysqli_fetch_object

mysqli_fetch_object

Funktion

Liefert die nächste Zeile einer Ergebnismenge als Objekt, wahlweise als Instanz einer eigenen Klasse.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_fetch_object(mysqli_result $result, string $class = 'stdClass', array $constructor_args = []): object|null|false

Beschreibung

mysqli_fetch_object() liest die nächste Zeile aus einem mysqli_result-Objekt und gibt sie als Objekt zurück. Standardmäßig wird ein stdClass-Objekt erzeugt, dessen Eigenschaften den Spaltennamen der Abfrage entsprechen. Alternativ kann eine eigene Klasse angegeben werden, die dann instanziiert wird.

Die Funktion eignet sich besonders, wenn die abgerufenen Datenbankzeilen direkt als typisierte Domain-Objekte weiterverarbeitet werden sollen, ohne sie manuell in Klassen umwandeln zu müssen. Der Konstruktor der Zielklasse wird dabei nach dem Befüllen der Eigenschaften aufgerufen.

Gibt null zurück, wenn keine weiteren Zeilen vorhanden sind, und false bei einem Fehler. Typischerweise wird die Funktion in einer while-Schleife verwendet, um alle Zeilen nacheinander abzurufen.

Spalten, deren Name kein gültiger PHP-Bezeichner ist, sind dennoch als Objekteigenschaft zugänglich – beispielsweise über $obj->{'my-column'}.

Parameter

Name Typ Default Beschreibung
$result Pflicht mysqli_result Das mysqli_result-Objekt, das von Funktionen wie mysqli_query() oder mysqli_store_result() zurückgegeben wurde.
$class string stdClass Name der Klasse, deren Instanz erzeugt werden soll. Die Spalten der Ergebniszeile werden als Eigenschaften gesetzt, bevor der Konstruktor ausgeführt wird.
$constructor_args array [] Ein Array mit Argumenten, die an den Konstruktor der angegebenen Klasse übergeben werden.

Rückgabewert

Typ
object|null|false
Beschreibung
Gibt ein Objekt der angegebenen Klasse (Standard: stdClass) mit den Spaltenwerten der aktuellen Zeile zurück. Gibt null zurück, wenn keine weiteren Zeilen vorhanden sind. Gibt false bei einem Fehler zurück.

Beispiele

Alle Zeilen als stdClass-Objekte abrufen

<?php
$mysqli = new mysqli('localhost', 'benutzer', 'geheim', 'meinedb');

$result = $mysqli->query('SELECT id, name, email FROM benutzer ORDER BY id');

while ($zeile = mysqli_fetch_object($result)) {
    echo 'ID: ' . $zeile->id . ', Name: ' . $zeile->name . ', E-Mail: ' . $zeile->email . PHP_EOL;
}

$result->free();
$mysqli->close();
ID: 1, Name: Anna Müller, E-Mail: anna@example.com ID: 2, Name: Bernd Schmidt, E-Mail: bernd@example.com

Zeilen als eigene Klasse abrufen

<?php
class Benutzer {
    public int $id;
    public string $name;
    public string $email;
    private string $erstelltAm;

    public function __construct() {
        // Eigenschaften sind bereits gesetzt, wenn der Konstruktor läuft
        $this->erstelltAm = date('Y-m-d H:i:s');
    }

    public function getLabel(): string {
        return "#{$this->id}: {$this->name}";
    }
}

$mysqli = new mysqli('localhost', 'benutzer', 'geheim', 'meinedb');
$result = $mysqli->query('SELECT id, name, email FROM benutzer LIMIT 3');

while ($benutzer = mysqli_fetch_object($result, Benutzer::class)) {
    echo $benutzer->getLabel() . PHP_EOL;
}

$result->free();
$mysqli->close();
#1: Anna Müller #2: Bernd Schmidt #3: Clara Weber

// Wichtig · Fallstricke

Konstruktor-Reihenfolge: Bei der Verwendung einer eigenen Klasse werden die Spalten der Ergebniszeile als Objekteigenschaften gesetzt, bevor der Konstruktor ausgeführt wird. Das ermöglicht es dem Konstruktor, auf die befüllten Werte zuzugreifen, bedeutet aber auch, dass der Konstruktor gesetzte Standardwerte überschreiben kann.

Sicherheit: Wie bei allen Datenbankabfragen sollten Benutzereingaben niemals direkt in SQL-Strings eingefügt werden. Verwende stets Prepared Statements mit mysqli_prepare() und mysqli_bind_param(), um SQL-Injection zu verhindern.

Prozedurale vs. objektorientierte Verwendung: Die Funktion kann sowohl prozedural (mysqli_fetch_object($result)) als auch objektorientiert ($result->fetch_object()) aufgerufen werden. Beide Varianten sind funktional identisch.