W3docs

fetch_object

Apprenez à utiliser mysqli_fetch_object() en PHP pour récupérer les lignes d'un résultat MySQLi sous forme d'objet ou d'instance de classe.

mysqli_fetch_object() lit la prochaine ligne d'un jeu de résultats MySQLi et la retourne sous forme d'object PHP dont les propriétés portent le nom des colonnes de votre requête. C'est l'équivalent orienté objet de mysqli_fetch_assoc() et de mysqli_fetch_array() : au lieu d'écrire $row['name'], vous écrivez $row->name.

Ce chapitre couvre la signature de la fonction, la façon d'accéder aux colonnes, comment hydrater des lignes dans vos propres classes, la gestion des erreurs, et dans quels cas l'utiliser plutôt que les fonctions de récupération basées sur les tableaux.

Syntaxe

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

En style orienté objet, le même appel s'écrit $result->fetch_object().

ParamètreDescription
$resultUn jeu de résultats retourné par mysqli_query(), mysqli_store_result(), ou mysqli_use_result().
$classOptionnel. Le nom de la classe à instancier pour chaque ligne. Par défaut stdClass (un object anonyme générique).
$constructor_argsOptionnel. Un tableau d'arguments passés au constructeur de la classe.

Valeur de retour :

  • Un object peuplé avec les colonnes de la ligne lorsqu'une ligne est disponible.
  • null lorsqu'il n'y a plus de lignes (c'est ce qui met fin à la boucle while).
  • false en cas d'échec.

Utilisation de base

Appelez la fonction dans une boucle while. Chaque itération avance le pointeur de ligne interne d'un cran jusqu'au retour de null :

<?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);
?>

Chaque $row est un object stdClass, donc ses propriétés correspondent aux noms des colonnes sélectionnées (ou à leurs alias). Si une colonne n'existe pas dans la ligne, vous obtiendrez un avertissement et null, alors sélectionnez toujours les colonnes que vous comptez lire.

Important — noms de colonnes, pas positions. Comme l'object est indexé par nom, SELECT * et SELECT name, email se comportent différemment pour l'ordre. Préférez nommer les colonnes explicitement pour qu'un changement de schéma ne puisse pas casser l'accès aux propriétés.

Hydrater des lignes dans votre propre classe

Le vrai avantage de mysqli_fetch_object() sur les fonctions de récupération par tableau est qu'elle peut construire des instances de votre classe. Passez le nom de la classe comme deuxième 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
}
?>

L'assignation des propriétés se produit avant l'exécution du constructeur. PHP définit les valeurs des colonnes directement sur les propriétés de l'object d'abord, puis appelle __construct(). Si votre classe a besoin que le constructeur voie ces valeurs, tenez compte de cet ordre :

<?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"]);
?>

Gestion de l'absence de lignes et des erreurs

Distinguez « plus de lignes » (null) d'un véritable échec (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;
    }
}
?>

Pour le code de production, activez le mode exception afin que les requêtes échouées lèvent une exception plutôt que de retourner false :

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

fetch_object vs. les autres fonctions de récupération

FonctionRetourneAccès aux colonnes par
mysqli_fetch_object()object$row->name
mysqli_fetch_assoc()tableau associatif$row['name']
mysqli_fetch_array()array (les deux)$row['name'] et $row[0]
mysqli_fetch_row()tableau énuméré$row[0]
mysqli_fetch_all()array de toutes les lignespar index ou par nom

Choisissez mysqli_fetch_object() lorsque vous voulez un accès propre via ->propriété ou lorsque vous souhaitez transformer chaque ligne en object de domaine avec un comportement (méthodes). Choisissez les fonctions basées sur les tableaux lorsque vous avez simplement besoin de données brutes à parcourir ou à sérialiser.

Bonnes pratiques

  • Utilisez des requêtes préparées pour toute valeur provenant d'une saisie utilisateur afin de prévenir les injections SQL ; vous pouvez toujours appeler fetch_object() sur le résultat d'une requête préparée.
  • Libérez le résultat avec mysqli_free_result() une fois que vous avez terminé afin de libérer la mémoire pour les grands jeux de résultats.
  • Sélectionnez uniquement les colonnes dont vous avez besoin pour que les propriétés de l'object soient prévisibles et que les requêtes restent rapides.

Conclusion

mysqli_fetch_object() parcourt un jeu de résultats MySQLi ligne par ligne, retournant chaque ligne sous forme d'object avec des propriétés nommées d'après les colonnes — ou, lorsqu'un nom de classe est fourni, sous forme d'instance pleinement construite de votre propre classe. Elle retourne null lorsque les lignes sont épuisées et false en cas d'échec. Utilisez-la lorsque la syntaxe objet ou l'hydratation de domaine est plus lisible que les fonctions basées sur les tableaux comme mysqli_fetch_assoc().

Pratique

Pratique
Quel est le rôle de la méthode fetch_object() en PHP ?
Quel est le rôle de la méthode fetch_object() en PHP ?
Was this page helpful?