fetch_field
Aprende a usar mysqli_fetch_field() en PHP para obtener metadatos de columnas de un resultado de consulta, con ejemplos y propiedades del objeto.
La función mysqli_fetch_field() devuelve metadatos sobre una columna — no los datos que contiene. Cada vez que la llamas, obtienes un object que describe la siguiente columna del conjunto de resultados: su nombre, tipo de datos, longitud, la tabla de la que proviene y diversas banderas. Esta página explica cuándo es útil, cómo se comporta la función, qué significa cada propiedad y cómo leerla tanto en estilo orientado a objetos como en estilo procedimental.
Qué hace mysqli_fetch_field()
mysqli_fetch_field() recorre las columnas de un conjunto de resultados de una en una, como un cursor. El conjunto de resultados mantiene un puntero de campo interno; cada llamada exitosa lo avanza en uno. Cuando llegas a la última columna, la siguiente llamada devuelve false, lo que resulta conveniente para manejar un bucle while.
Devuelve metadatos, por lo que nunca necesitas filas reales para usarla — una consulta que no devuelve ninguna fila sigue describiendo sus columnas. Esa es exactamente la razón por la que resulta práctica: puedes inspeccionar la estructura de un resultado antes de procesarlo.
Sintaxis (ambos estilos son equivalentes):
// Object-oriented style
$fieldInfo = $result->fetch_field();
// Procedural style
$fieldInfo = mysqli_fetch_field($result);Recibe el conjunto de resultados como única entrada y devuelve un object en caso de éxito o false cuando no hay más campos.
Leer metadatos de columnas
El ejemplo siguiente conecta, ejecuta un SELECT y recorre las columnas del resultado. Cada iteración imprime el nombre, el código de tipo y la longitud máxima de la columna.
¿Cómo usar la función 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();
?>El bucle while ($field = $result->fetch_field()) termina naturalmente cuando fetch_field() devuelve false tras la última columna. Como el puntero de campo avanza en cada llamada, la primera iteración describe la primera columna, la segunda iteración la segunda columna, y así sucesivamente.
El object de campo y sus propiedades
Cada llamada devuelve un object similar a stdClass. Las propiedades más usadas son:
| Propiedad | Significado |
|---|---|
name | El nombre de la columna tal como lo devuelve la consulta (un alias, si se usó uno) |
orgname | El nombre original de la columna, antes del alias |
table | La tabla a la que pertenece la columna (un alias, si se usó uno) |
orgtable | El nombre original de la tabla |
type | El tipo de datos, como constante entera (ver más abajo) |
length | El ancho declarado de la columna |
max_length | El ancho máximo de los valores reales (a menudo 0 salvo que estén en búfer) |
flags | Una máscara de bits de banderas de columna (NOT_NULL, PRI_KEY, …) |
decimals | Número de decimales para campos numéricos |
La propiedad type es un entero, no una cadena legible. PHP expone constantes como MYSQLI_TYPE_VARCHAR, MYSQLI_TYPE_LONG (una columna entera) y MYSQLI_TYPE_DATETIME para que puedas comparar contra ella:
if ($field->type === MYSQLI_TYPE_LONG) {
echo "{$field->name} is an integer column\n";
}Apuntar a una columna específica
fetch_field() es secuencial, así que para inspeccionar, por ejemplo, solo la tercera columna tendrías que recorrer el bucle hasta llegar a ella o reposicionar el puntero antes. El puntero de campo se puede reposicionar con field_seek(), y una sola columna puede obtenerse directamente por índice con 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;Cuándo usarla (y las alternativas)
Recurre a fetch_field() cuando quieras iterar sobre las columnas y reaccionar a cada una — por ejemplo, para generar automáticamente el encabezado de una tabla, construir un formulario o decidir cómo formatear cada valor según su tipo.
- Si necesitas los metadatos de todas las columnas de una sola vez,
fetch_fields()los devuelve todos como un array en una sola llamada, lo que suele ser más limpio que un bucle. - Si solo necesitas saber cuántas columnas hay, usa
field_count. - Para leer los datos reales de las filas en lugar de los metadatos de las columnas, usa
fetch_assoc()ofetch_array().
Conclusión
mysqli_fetch_field() te ofrece una vista columna a columna de la estructura de un conjunto de resultados: nombres, tipos, longitudes y banderas, avanzando por las columnas de una llamada en una llamada. Recórrela con un bucle para inspeccionar una consulta antes de procesar sus filas, combínala con field_seek() para apuntar a una columna concreta, o cámbiala por fetch_fields() cuando quieras todos los metadatos de una vez.