W3docs

fetch_object

Erfahren Sie, wie mysqli_fetch_object() in PHP Ergebniszeilen als Objekte zurückgibt und wie Sie eigene Klassen damit befüllen.

mysqli_fetch_object() liest die nächste Zeile eines MySQLi-Ergebnissets und gibt sie als PHP-object zurück, dessen Eigenschaften nach den Spalten Ihrer Abfrage benannt sind. Es ist der objektorientierte Verwandte von mysqli_fetch_assoc() und mysqli_fetch_array(): Statt $row['name'] zu schreiben, verwenden Sie $row->name.

Dieses Kapitel behandelt die Funktionssignatur, den Zugriff auf Spalten, das Befüllen von Zeilen in eigene Klassen, die Fehlerbehandlung und wann Sie diese Funktion gegenüber den array-basierten Fetchern bevorzugen sollten.

Syntax

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

Im objektorientierten Stil lautet derselbe Aufruf $result->fetch_object().

ParameterBeschreibung
$resultEin Ergebnisset, das von mysqli_query(), mysqli_store_result() oder mysqli_use_result() zurückgegeben wurde.
$classOptional. Der Name der Klasse, die für jede Zeile instanziiert wird. Standardmäßig stdClass (ein generisches anonymes object).
$constructor_argsOptional. Ein array von Argumenten, die an den Klassenkonstruktor übergeben werden.

Rückgabewert:

  • Ein object, das mit den Spalten der Zeile befüllt ist, wenn eine Zeile verfügbar ist.
  • null, wenn es keine weiteren Zeilen gibt (dies beendet die while-Schleife).
  • false bei einem Fehler.

Grundlegende Verwendung

Rufen Sie die Funktion in einer while-Schleife auf. Jede Iteration rückt den internen Zeilenzeiger um eine Position vor, bis null zurückgegeben wird:

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

$result = mysqli_query($mysqli, "SELECT name, email FROM users");

if ($result) {
    while ($row = mysqli_fetch_object($result)) {
        printf("%s (%s)\n", $row->name, $row->email);
    }
    mysqli_free_result($result);
}

mysqli_close($mysqli);
?>

Jedes $row ist ein stdClass-object, dessen Eigenschaften den ausgewählten Spaltennamen (oder deren Aliasnamen) entsprechen. Wenn eine Spalte in der Zeile nicht vorhanden ist, erhalten Sie einen Hinweis und null – wählen Sie daher immer die Spalten aus, die Sie lesen möchten.

Wichtig – Spaltennamen, keine Positionen. Da das object nach Namen indiziert ist, verhalten sich SELECT * und SELECT name, email bei der Reihenfolge unterschiedlich. Benennen Sie Spalten lieber explizit, damit eine Schema-Änderung den Eigenschaftszugriff nicht beschädigen kann.

Zeilen in eigene Klassen befüllen

Die eigentliche Stärke von mysqli_fetch_object() gegenüber den array-Fetchern liegt darin, dass es Instanzen Ihrer Klasse erstellen kann. Übergeben Sie den Klassenamen als zweites Argument:

<?php
class User
{
    public string $name;
    public string $email;

    public function greet(): string
    {
        return "Hi, I'm {$this->name}";
    }
}

$result = mysqli_query($mysqli, "SELECT name, email FROM users");

while ($user = mysqli_fetch_object($result, User::class)) {
    echo $user->greet(), "\n"; // calls a real method on a real User object
}
?>

Die Eigenschaftszuweisung erfolgt vor dem Konstruktoraufruf. PHP setzt die Spaltenwerte zunächst direkt auf die Eigenschaften des objects und ruft dann erst __construct() auf. Wenn Ihre Klasse diese Werte im Konstruktor bereits benötigt, müssen Sie diese Reihenfolge berücksichtigen:

<?php
class Product
{
    public string $name;
    public float  $price;
    public string $label;

    public function __construct(string $currency = "USD")
    {
        // $this->name and $this->price are already set here
        $this->label = "{$this->name}: {$this->price} {$currency}";
    }
}

// Constructor args are passed as the third parameter:
$product = mysqli_fetch_object($result, Product::class, ["EUR"]);
?>

Fehlende Zeilen und Fehler behandeln

Unterscheiden Sie „keine weiteren Zeilen" (null) von einem echten Fehler (false):

<?php
$result = mysqli_query($mysqli, "SELECT name FROM users WHERE id = 999");

if ($result === false) {
    echo "Query failed: " . mysqli_error($mysqli);
} else {
    $row = mysqli_fetch_object($result);

    if ($row === null) {
        echo "No user found.";
    } else {
        echo $row->name;
    }
}
?>

Aktivieren Sie für Produktionscode den Exception-Modus, damit fehlgeschlagene Abfragen eine Ausnahme werfen, anstatt false zurückzugeben:

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

fetch_object im Vergleich zu anderen Fetchern

FunktionGibt zurückSpalten ansprechen per
mysqli_fetch_object()object$row->name
mysqli_fetch_assoc()assoziatives array$row['name']
mysqli_fetch_array()array (beides)$row['name'] und $row[0]
mysqli_fetch_row()numerisches array$row[0]
mysqli_fetch_all()array aller Zeilenper Index oder Name

Wählen Sie mysqli_fetch_object(), wenn Sie sauberen ->property-Zugriff möchten oder wenn jede Zeile in ein Domain-object mit Verhalten (Methoden) umgewandelt werden soll. Wählen Sie die array-Fetcher, wenn Sie einfache Daten zum Iterieren oder Serialisieren benötigen.

Best Practices

  • Verwenden Sie Prepared Statements für alle Werte aus Benutzereingaben, um SQL-Injection zu verhindern; Sie können fetch_object() weiterhin auf das Ergebnis eines Prepared Statements aufrufen.
  • Geben Sie das Ergebnis mit mysqli_free_result() frei, wenn Sie fertig sind, um bei großen Ergebnissets Arbeitsspeicher freizugeben.
  • Wählen Sie nur die benötigten Spalten aus, damit object-Eigenschaften vorhersehbar bleiben und Abfragen schnell sind.

Fazit

mysqli_fetch_object() durchläuft ein MySQLi-Ergebnisset Zeile für Zeile und gibt jede Zeile als object mit spaltenbenannten Eigenschaften zurück – oder, wenn ein Klassenname angegeben wird, als vollständig konstruierte Instanz Ihrer eigenen Klasse. Es gibt null zurück, wenn keine Zeilen mehr vorhanden sind, und false bei einem Fehler. Verwenden Sie es, wenn object-Syntax oder Domain-Hydration lesbarer ist als die array-basierten Fetcher wie mysqli_fetch_assoc().

Übungen

Übung
Welche Aufgabe hat die Methode fetch_object() in PHP?
Welche Aufgabe hat die Methode fetch_object() in PHP?
Was this page helpful?