fetch_fields
Découvrez la fonction mysqli_fetch_fields() en PHP pour récupérer les métadonnées des colonnes d'un résultat MySQLi.
La fonction mysqli_fetch_fields() retourne un array d'objets décrivant les colonnes (champs) d'un résultat MySQLi — leurs noms, types, longueurs, tables sources et indicateurs. Elle lit les métadonnées des colonnes, et non les données des lignes elles-mêmes. Cette page explique la syntaxe, ce que contient chaque object champ, quand l'utiliser et les pièges courants.
Syntaxe
mysqli_fetch_fields(mysqli_result $result): arrayDans le style orienté objet, le même appel s'écrit $result->fetch_fields().
$result— un résultat retourné parmysqli_query(),mysqli_store_result(), oumysqli_use_result().- Valeur de retour — un array d'objets
stdClass, un par colonne, dans l'ordre où les colonnes apparaissent dans le résultat. Chaque object expose des propriétés telles quename,orgname,table,orgtable,type,length,max_length,decimalsetflags.
Ce que contient chaque object champ
| Propriété | Description |
|---|---|
name | Le nom de la colonne (ou son alias, si vous avez utilisé AS). |
orgname | Le nom de colonne original, sans tenir compte de l'alias. |
table | Le nom de la table (ou son alias). |
orgtable | Le nom de table original. |
max_length | La largeur de la valeur la plus longue dans le résultat (définie uniquement après mysqli_store_result()). |
length | La largeur définie de la colonne telle que déclarée dans le schéma. |
type | Un code de type entier (voir les constantes MYSQLI_TYPE_*). |
decimals | Nombre de décimales pour les champs numériques. |
flags | Un masque de bits des indicateurs MYSQLI_*_FLAG tels que NOT_NULL, PRI_KEY, AUTO_INCREMENT. |
Quand l'utiliser ?
Utilisez mysqli_fetch_fields() lorsque vous devez travailler avec un résultat de requête de manière générique — sans connaître les colonnes à l'avance. Cas typiques :
- Construire une grille d'administration/données qui affiche n'importe quelle requête
SELECT *, en utilisant les noms de colonnes comme en-têtes de tableau. - Exporter les résultats en CSV avec une ligne d'en-tête.
- Vérifier si une colonne est une clé primaire ou en auto-incrémentation avant de générer un formulaire d'édition.
Si vous avez seulement besoin des noms de colonnes, c'est la méthode la plus directe pour les obtenir. Pour récupérer la description d'un seul champ à la fois, utilisez plutôt mysqli_fetch_field(), et pour compter les colonnes utilisez mysqli_field_count().
Exemple : lister toutes les colonnes d'un résultat
<?php
$mysqli = mysqli_connect("localhost", "user", "password", "shop");
$result = mysqli_query($mysqli, "SELECT id, name, price FROM products");
$fields = mysqli_fetch_fields($result);
foreach ($fields as $field) {
printf("Name: %s, Type: %d, Length: %d\n",
$field->name, $field->type, $field->length);
}
mysqli_free_result($result);
mysqli_close($mysqli);
?>La boucle foreach parcourt l'array d'objets champ et affiche le nom, le code de type et la longueur définie de chaque colonne. Pour les trois colonnes sélectionnées, la sortie ressemble à :
Name: id, Type: 3, Length: 11
Name: name, Type: 253, Length: 255
Name: price, Type: 246, Length: 10Les valeurs type numériques proviennent des constantes MYSQLI_TYPE_* — par exemple 3 correspond à MYSQLI_TYPE_LONG (un INT) et 253 à MYSQLI_TYPE_VAR_STRING (un VARCHAR).
Construire un en-tête CSV à partir des noms de champs
Comme l'array de champs est générique, vous pouvez construire une ligne d'en-tête pour n'importe quelle requête sans coder les noms de colonnes en dur :
<?php
$result = mysqli_query($mysqli, "SELECT * FROM products");
$header = array_map(
fn($field) => $field->name,
mysqli_fetch_fields($result)
);
echo implode(",", $header), "\n"; // id,name,pricearray_map() transforme l'array d'objets champ en un simple array de noms, et implode() les joint avec des virgules.
Pièges courants
mysqli_fetch_fields()ne fournit que des métadonnées. Elle ne déplace pas le curseur de ligne et ne retourne aucune donnée de ligne — combinez-la avecmysqli_fetch_assoc()oumysqli_fetch_array()pour lire les lignes réelles.max_lengthvaut0avec des résultats non mis en mémoire tampon. Elle n'est renseignée que lorsque le résultat complet est mis en mémoire tampon côté client viamysqli_store_result()(ce quemysqli_query()utilise par défaut). Avecmysqli_use_result(), la valeur reste0.typeetflagssont des entiers, pas des string. Comparez-les avec les constantesMYSQLI_TYPE_*etMYSQLI_*_FLAGplutôt qu'avec des nombres magiques, afin que l'intention soit claire.- Vérifiez toujours que
$resultest vrai avant d'appeler la fonction — une requête échouée retournefalse, et passerfalseprovoque une erreur.
Fonctions liées
mysqli_fetch_field()— récupérer les métadonnées d'une colonne à la fois.mysqli_field_count()— compter les colonnes dans le résultat.mysqli_field_seek()— déplacer le curseur de champ vers une colonne spécifique.mysqli_fetch_assoc()— lire les lignes du résultat sous forme de tableaux associatifs.