W3docs

fetch_fields

Aprende a usar mysqli_fetch_fields() en PHP para obtener metadatos de las columnas de un resultado MySQLi: nombres, tipos, longitudes y más.

La función mysqli_fetch_fields() devuelve un array de objetos que describen las columnas (campos) de un conjunto de resultados MySQLi — sus nombres, tipos, longitudes, tablas de origen y flags. Lee metadatos sobre las columnas, no los datos de las filas en sí. Esta página explica la sintaxis, qué contiene cada objeto de campo, cuándo conviene usarla y los errores comunes.

Sintaxis

mysqli_fetch_fields(mysqli_result $result): array

En el estilo orientado a objetos, la misma llamada es $result->fetch_fields().

  • $result — un conjunto de resultados devuelto por mysqli_query(), mysqli_store_result() o mysqli_use_result().
  • Valor de retorno — un array de objetos stdClass, uno por columna, en el orden en que aparecen las columnas en el resultado. Cada objeto expone propiedades como name, orgname, table, orgtable, type, length, max_length, decimals y flags.

Qué contiene cada objeto de campo

PropiedadDescripción
nameEl nombre de la columna (o su alias, si usaste AS).
orgnameEl nombre original de la columna, sin tener en cuenta ningún alias.
tableEl nombre de la tabla (o su alias).
orgtableEl nombre original de la tabla.
max_lengthEl ancho del valor más amplio en el resultado (solo se establece después de mysqli_store_result()).
lengthEl ancho definido de la columna tal como se declaró en el esquema.
typeUn código de tipo entero (consulta las constantes MYSQLI_TYPE_*).
decimalsNúmero de decimales para campos numéricos.
flagsUna máscara de bits de flags MYSQLI_*_FLAG como NOT_NULL, PRI_KEY, AUTO_INCREMENT.

¿Cuándo usarla?

Recurre a mysqli_fetch_fields() cuando necesites trabajar con el resultado de una consulta de forma genérica — sin conocer las columnas de antemano. Casos típicos:

  • Construir un panel de administración o cuadrícula de datos que renderice cualquier consulta SELECT *, usando los nombres de columna como encabezados de tabla.
  • Exportar resultados a CSV con una fila de encabezado.
  • Inspeccionar si una columna es clave primaria o auto-incremento antes de generar un formulario de edición.

Si solo necesitas los nombres de las columnas, esta es la forma más directa de obtenerlos. Para obtener la descripción de un campo a la vez, usa mysqli_fetch_field(), y para contar las columnas usa mysqli_field_count().

Ejemplo: listar cada columna de un conjunto de resultados

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

El bucle foreach recorre el array de objetos de campo e imprime el nombre, el código de tipo y la longitud definida de cada columna. Para las tres columnas seleccionadas, la salida tiene este aspecto:

Name: id, Type: 3, Length: 11
Name: name, Type: 253, Length: 255
Name: price, Type: 246, Length: 10

Los valores numéricos de type provienen de las constantes MYSQLI_TYPE_* — por ejemplo, 3 es MYSQLI_TYPE_LONG (un INT) y 253 es MYSQLI_TYPE_VAR_STRING (un VARCHAR).

Construir un encabezado CSV a partir de los nombres de campo

Dado que el array de campos es genérico, puedes construir una fila de encabezado para cualquier consulta sin codificar los nombres de columna de forma fija:

<?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,price

array_map() convierte el array de objetos de campo en un array simple de nombres, e implode() los une con comas.

Errores comunes

  • mysqli_fetch_fields() solo devuelve metadatos. No mueve el cursor de fila y no devuelve datos de fila — combínala con mysqli_fetch_assoc() o mysqli_fetch_array() para leer las filas reales.
  • max_length es 0 con resultados no almacenados en búfer. Solo se rellena cuando el conjunto de resultados completo está almacenado en el cliente mediante mysqli_store_result() (que mysqli_query() usa por defecto). Con mysqli_use_result(), el valor permanece en 0.
  • type y flags son enteros, no strings. Compáralos con las constantes MYSQLI_TYPE_* y MYSQLI_*_FLAG en lugar de números mágicos, para que la intención quede clara.
  • Siempre verifica que $result sea verdadero antes de llamar a la función — una consulta fallida devuelve false, y pasar false genera un error.

Funciones relacionadas

Práctica

Práctica
What can be done with the fetch_field() function in PHP?
What can be done with the fetch_field() function in PHP?
Was this page helpful?