mysqli_result::fetch_fields

mysqli_fetch_fields

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_fields -- mysqli_fetch_fieldsDevuelve un array de objetos que representan los campos de un conjunto de resultados

Descripción

Estilo orientado a objetos

mysqli_result::fetch_fields(): array

Estilo por procedimientos

mysqli_fetch_fields(mysqli_result $result): array

Esta función sirve de propósito idéntico a la función mysqli_fetch_field() con la única diferencia de que, en lugar de devolver un objeto por cada campo, las columnas son devueltas en un array de objetos.

Parámetros

result

Sólo estilo por procedimientos: Un conjunto de identificadores de resultados devuelto por mysqli_query(), mysqli_store_result() o mysqli_use_result().

Valores devueltos

Devuelve un array de objetos que contiene la información de definición de los campos o false si no hay información de campo disponible.

Propiedades del objeto
Propiedad Descripción
name El nombre de la columna
orgname El nombre original de la columna si se especificó un alias
table El nombre de la tabla al que pertenece el campo (si no es calculado)
orgtable El nombre original de la tabla si se especificó un alias
max_length El ancho máximo del campo del conjunto de resultados.
length El ancho del campo, en bytes, como se especificó en la definición de la tabla. Observe que este número (bytes) podría diferir del valor de la definición de la tabla (caracteres), dependiendo del conjunto de caracteres que se emplee. Por ejemplo, el conjunto de caracteres utf8 tiene 3 bytes por carácter, por lo que varchar(10) devolverá una longitud de 30 para utf8 (10*3), aunque devuelve 10 para latin1 (10*1).
charsetnr El número del conjunto de caracteres (id) del campo.
flags Un entero que representa las banderas de bits del campo.
type El tipo de datos usado por el campo
decimals El número de decimales usado (para campos integer)

Ejemplos

Ejemplo #1 Estilo orientado a objetos

<?php
$mysqli
= new mysqli("127.0.0.1", "root", "foofoo", "sakila");

/* comprobar la conexión */
if (mysqli_connect_errno()) {
printf("Falló la conexión: %s\n", $mysqli->connect_error);
exit();
}

foreach (array(
'latin1', 'utf8') as $conj_caract) {

// Establecer el conjunto de caracteres para mostrar su impacto en algunos valores (p.ej., longitud en bytes)
$mysqli->set_charset($conj_caract);

$consulta = "SELECT actor_id, last_name from actor ORDER BY actor_id";

echo
"======================\n";
echo
"Conjunto de caracteres: $conj_caract\n";
echo
"======================\n";

if (
$resultado = $mysqli->query($consulta)) {

/* Obtener la información del campo para todas las columnas */
$info_campo = $resultado->fetch_fields();

foreach (
$info_campo as $valor) {
printf("Nombre: %s\n", $valor->name);
printf("Tabla: %s\n", $valor->table);
printf("Longitud máx.: %d\n", $valor->max_length);
printf("Longitud: %d\n", $valor->length);
printf("Nº conj. caract.: %d\n", $valor->charsetnr);
printf("Banderas: %d\n", $valor->flags);
printf("Tipo: %d\n\n", $valor->type);
}
$resultado->free();
}
}
$mysqli->close();
?>

Ejemplo #2 Estilo por procedimientos

<?php
$enlace
= mysqli_connect("127.0.0.1", "mi_usuario", "mi_contraseña", "sakila");

/* comprobar la conexión */
if (mysqli_connect_errno()) {
printf("Falló la conexión: %s\n", mysqli_connect_error());
exit();
}

foreach (array(
'latin1', 'utf8') as $conj_caract) {

// Establecer el conjunto de caracteres para mostrar su impacto en algunos valores (p.ej., longitud en bytes)
mysqli_set_charset($enlace, $conj_caract);

$consulta = "SELECT actor_id, last_name from actor ORDER BY actor_id";

echo
"===============================\n";
echo
"Conjunto de caracteres: $conj_caract\n";
echo
"===============================\n";

if (
$resultado = mysqli_query($enlace, $consulta)) {

/* Obtener la información del campo para todas las columnas */
$info_campo = mysqli_fetch_fields($resultado);

foreach (
$info_campo as $valor) {
printf("Nombre: %s\n", $valor->name);
printf("Tabla: %s\n", $valor->table);
printf("Longitud máx.: %d\n", $valor->max_length);
printf("Longitud: %d\n", $valor->length);
printf("Nº conj. caract.: %d\n", $valor->charsetnr);
printf("Banderas: %d\n", $valor->flags);
printf("Tipo: %d\n\n", $valor->type);
}
mysqli_free_result($resultado);
}
}

mysqli_close($enlace);
?>

El resultado de los ejemplos sería:

===============================
Conjunto de caracteres: latin1
===============================
Nombre:           actor_id
Tabla:            actor
Longitud máx.:    3
Longitud:         5
Nº conj. caract.: 63
Banderas:         49699
Tipo:             2

Nombre:           last_name
Tabla:            actor
Longitud máx.:    12
Longitud:         45
Nº conj. caract.: 8
Banderas:         20489
Tipo:             253

===============================
Conjunto de caracteres: utf8
===============================
Nombre:           actor_id
Tabla:            actor
Longitud máx.:    3
Longitud:         5
Nº conj. caract.: 63
Banderas:         49699
Tipo:             2

Nombre:           last_name
Tabla:            actor
Longitud máx.:    12
Longitud:         135
Nº conj. caract.: 33
Banderas:         20489

Ver también

add a note add a note

User Contributed Notes 6 notes

up
16
AndrewRoz
13 years ago
The field info bit-flags used by MySql are:                                                                                                                                           
(Thanks to ragtag at hotmail dot com)
<?php
/*
       NOT_NULL_FLAG = 1                                                                             
       PRI_KEY_FLAG = 2                                                                              
       UNIQUE_KEY_FLAG = 4                                                                           
       BLOB_FLAG = 16                                                                                
       UNSIGNED_FLAG = 32                                                                            
       ZEROFILL_FLAG = 64                                                                            
       BINARY_FLAG = 128                                                                             
       ENUM_FLAG = 256                                                                               
       AUTO_INCREMENT_FLAG = 512                                                                     
       TIMESTAMP_FLAG = 1024                                                                         
       SET_FLAG = 2048                                                                               
       NUM_FLAG = 32768                                                                              
       PART_KEY_FLAG = 16384                                                                         
       GROUP_FLAG = 32768                                                                            
       UNIQUE_FLAG = 65536
*/                                                                           

// To test if a flag is set you can use & like so:

 
$meta = $mysqli_result_object->fetch_field();
  if (
$meta->flags & 4) {
     echo
'Unique key flag is set';
  }
?>
up
5
andre at koethur dot de
10 years ago
Here are two methods for converting the 'type' and 'flags' attributes to text for debugging purposes. They both use the predefined MYSQLI_ constants to generate the text.

<?php

public static function h_type2txt($type_id)
{
    static
$types;

    if (!isset(
$types))
    {
       
$types = array();
       
$constants = get_defined_constants(true);
        foreach (
$constants['mysqli'] as $c => $n) if (preg_match('/^MYSQLI_TYPE_(.*)/', $c, $m)) $types[$n] = $m[1];
    }

    return
array_key_exists($type_id, $types)? $types[$type_id] : NULL;
}

public static function
h_flags2txt($flags_num)
{
    static
$flags;

    if (!isset(
$flags))
    {
       
$flags = array();
       
$constants = get_defined_constants(true);
        foreach (
$constants['mysqli'] as $c => $n) if (preg_match('/MYSQLI_(.*)_FLAG$/', $c, $m)) if (!array_key_exists($n, $flags)) $flags[$n] = $m[1];
    }

   
$result = array();
    foreach (
$flags as $n => $t) if ($flags_num & $n) $result[] = $t;
    return
implode(' ', $result);
}

?>
up
4
mccharles dot craven at dot dot gov
8 years ago
Those wanting to map the 'type' field in this function for use in mysqli_stmt_bind_param or to cannibalize it for their own mapping may find this function useful.

function map_field_type_to_bind_type($field_type)
{
    switch ($field_type)
    {
    case MYSQLI_TYPE_DECIMAL:
    case MYSQLI_TYPE_NEWDECIMAL:
    case MYSQLI_TYPE_FLOAT:
    case MYSQLI_TYPE_DOUBLE:
        return 'd';

    case MYSQLI_TYPE_BIT:
    case MYSQLI_TYPE_TINY:
    case MYSQLI_TYPE_SHORT:
    case MYSQLI_TYPE_LONG:
    case MYSQLI_TYPE_LONGLONG:
    case MYSQLI_TYPE_INT24:
    case MYSQLI_TYPE_YEAR:
    case MYSQLI_TYPE_ENUM:
        return 'i';

    case MYSQLI_TYPE_TIMESTAMP:
    case MYSQLI_TYPE_DATE:
    case MYSQLI_TYPE_TIME:
    case MYSQLI_TYPE_DATETIME:
    case MYSQLI_TYPE_NEWDATE:
    case MYSQLI_TYPE_INTERVAL:
    case MYSQLI_TYPE_SET:
    case MYSQLI_TYPE_VAR_STRING:
    case MYSQLI_TYPE_STRING:
    case MYSQLI_TYPE_CHAR:
    case MYSQLI_TYPE_GEOMETRY:
        return 's';

    case MYSQLI_TYPE_TINY_BLOB:
    case MYSQLI_TYPE_MEDIUM_BLOB:
    case MYSQLI_TYPE_LONG_BLOB:
    case MYSQLI_TYPE_BLOB:
        return 'b';

    default:
        trigger_error("unknown type: $field_type");
        return 's';
    }
}
up
2
educarme at adinet dot com dot uy
11 years ago
Codigos de tipos de datos devueltos por fetch_fields()

Nombre        Codigo
tinyint_    1
boolean_    1
smallint_    2
int_        3
float_        4
double_        5
real_        5
timestamp_    7
bigint_        8
serial        8
mediumint_    9
date_        10
time_        11
datetime_    12
year_        13
bit_        16
decimal_    246
text_        252
tinytext_    252
mediumtext_    252
longtext_    252
tinyblob_    252
mediumblob_    252
blob_        252
longblob_    252
varchar_    253
varbinary_    253
char_        254
binary_        254
up
0
cz dot paranoiq at gmail dot com
9 years ago
complete list of flags from MySQL source code:

NOT_NULL_FLAG   1       /* Field can't be NULL */
PRI_KEY_FLAG    2       /* Field is part of a primary key */
UNIQUE_KEY_FLAG 4       /* Field is part of a unique key */
MULTIPLE_KEY_FLAG 8     /* Field is part of a key */
BLOB_FLAG   16      /* Field is a blob */
UNSIGNED_FLAG   32      /* Field is unsigned */
ZEROFILL_FLAG   64      /* Field is zerofill */
BINARY_FLAG 128     /* Field is binary   */
ENUM_FLAG   256     /* field is an enum */
AUTO_INCREMENT_FLAG 512     /* field is a autoincrement field */
TIMESTAMP_FLAG  1024        /* Field is a timestamp */
SET_FLAG    2048        /* field is a set */
NO_DEFAULT_VALUE_FLAG 4096  /* Field doesn't have default value */
ON_UPDATE_NOW_FLAG 8192         /* Field is set to NOW on UPDATE */
NUM_FLAG    32768       /* Field is num (for clients) */
PART_KEY_FLAG   16384       /* Intern; Part of some key */
GROUP_FLAG  32768       /* Intern: Group field */
UNIQUE_FLAG 65536       /* Intern: Used by sql_yacc */
BINCMP_FLAG 131072      /* Intern: Used by sql_yacc */
GET_FIXED_FIELDS_FLAG (1 << 18) /* Used to get fields in item tree */
FIELD_IN_PART_FUNC_FLAG (1 << 19)/* Field part of partition func */
up
-1
attand at gmail dot com
6 years ago
The nax_length gives counts in bytes. So if the text is utf-8, then we get incorrect result.

We have a code snippet where we check if the maximum length of the field and the max length of data stored becomes equal. This way we can check the potential truncation of data inserted
To Top