fetch_field
Découvrez la fonction mysqli_fetch_field() en PHP pour récupérer les métadonnées d'une colonne d'un ensemble de résultats, avec exemples.
La fonction mysqli_fetch_field() renvoie des métadonnées sur une colonne — pas les données qu'elle contient. À chaque appel, vous obtenez un object décrivant la colonne suivante dans l'ensemble de résultats : son nom, son type de données, sa longueur, la table dont elle provient et divers indicateurs. Cette page explique dans quel cas cela est utile, comment la fonction se comporte, ce que signifie chaque propriété et comment la lire en style orienté objet et en style procédural.
Ce que fait mysqli_fetch_field()
mysqli_fetch_field() parcourt les colonnes d'un ensemble de résultats une à une, comme un curseur. L'ensemble de résultats conserve un pointeur de champ interne ; chaque appel réussi l'avance d'une position. Lorsque vous atteignez la dernière colonne, l'appel suivant renvoie false, ce qui permet de piloter facilement une boucle while.
Elle renvoie des métadonnées, vous n'avez donc pas besoin de lignes réelles pour l'utiliser — une requête qui ne retourne aucune ligne décrit quand même ses colonnes. C'est exactement pourquoi elle est pratique : vous pouvez inspecter la structure d'un résultat avant de le traiter.
Syntaxe (les deux styles sont équivalents) :
// Object-oriented style
$fieldInfo = $result->fetch_field();
// Procedural style
$fieldInfo = mysqli_fetch_field($result);Elle prend l'ensemble de résultats comme seul paramètre et renvoie un object en cas de succès ou false lorsqu'il n'y a plus de champs.
Lecture des métadonnées de colonne
L'exemple ci-dessous se connecte, exécute un SELECT et parcourt les colonnes du résultat. Chaque itération affiche le nom, le code de type et la longueur maximale de la colonne.
Comment utiliser la fonction mysqli_fetch_field() ?
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
$query = "SELECT * FROM my_table";
$result = $mysqli->query($query);
if ($result) {
while ($field = $result->fetch_field()) {
printf("Name: %s\n", $field->name);
printf("Type: %s\n", $field->type);
printf("Length: %d\n", $field->length);
}
} else {
echo "Query failed: " . $mysqli->error;
}
$result->free();
$mysqli->close();
?>La boucle while ($field = $result->fetch_field()) se termine naturellement quand fetch_field() renvoie false après la dernière colonne. Comme le pointeur de champ avance à chaque appel, la première itération décrit la première colonne, la deuxième itération décrit la deuxième colonne, et ainsi de suite.
L'object champ et ses propriétés
Chaque appel renvoie un object de type stdClass. Les propriétés les plus couramment utilisées sont :
| Propriété | Signification |
|---|---|
name | Le nom de la colonne tel que renvoyé par la requête (un alias, le cas échéant) |
orgname | Le nom original de la colonne, avant l'aliasing |
table | La table à laquelle appartient la colonne (un alias, le cas échéant) |
orgtable | Le nom original de la table |
type | Le type de données, sous forme de constante entière (voir ci-dessous) |
length | La largeur déclarée de la colonne |
max_length | La largeur maximale des valeurs réelles (souvent 0 sauf si mis en tampon) |
flags | Un masque de bits des indicateurs de colonne (NOT_NULL, PRI_KEY, …) |
decimals | Nombre de décimales pour les champs numériques |
La propriété type est un entier, pas une string lisible. PHP expose des constantes telles que MYSQLI_TYPE_VARCHAR, MYSQLI_TYPE_LONG (une colonne entière) et MYSQLI_TYPE_DATETIME pour que vous puissiez les comparer :
if ($field->type === MYSQLI_TYPE_LONG) {
echo "{$field->name} is an integer column\n";
}Cibler une colonne spécifique
fetch_field() est séquentiel ; pour inspecter uniquement la troisième colonne, par exemple, vous devriez soit boucler jusqu'à l'atteindre, soit y accéder directement. Le pointeur de champ peut être repositionné avec field_seek(), et une seule colonne peut être récupérée directement par index avec fetch_field_direct() :
// Jump to column index 2 (the third column), then read it
$result->field_seek(2);
$field = $result->fetch_field();
echo $field->name;Quand l'utiliser (et les alternatives)
Utilisez fetch_field() lorsque vous souhaitez itérer sur les colonnes et réagir à chacune d'elles — par exemple pour générer automatiquement un en-tête de tableau, construire un formulaire ou décider comment formater chaque valeur selon son type.
- Si vous avez besoin des métadonnées de toutes les colonnes en une seule fois,
fetch_fields()les renvoie toutes sous forme d'array en un seul appel, ce qui est généralement plus propre qu'une boucle. - Si vous avez seulement besoin de savoir combien de colonnes il y a, utilisez
field_count. - Pour lire les données de ligne réelles plutôt que les métadonnées de colonne, utilisez
fetch_assoc()oufetch_array().
Conclusion
mysqli_fetch_field() vous offre une vue colonne par colonne de la structure d'un ensemble de résultats : noms, types, longueurs et indicateurs, en avançant dans les colonnes un appel à la fois. Parcourez-le pour inspecter une requête avant de traiter ses lignes, combinez-le avec field_seek() pour cibler une colonne, ou passez à fetch_fields() lorsque vous voulez toutes les métadonnées d'un coup.