This may be obvious, but the constants for the field types are already defined in PHP, and can be found in the documentation at: http://php.net/manual/en/mysqli.constants.php
mysqli_result::fetch_field_direct
mysqli_fetch_field_direct
(PHP 5)
mysqli_result::fetch_field_direct -- mysqli_fetch_field_direct — Obtener los metadatos de un único campo
Descripción
Estilo orientado a objetos
$fieldnr
)Estilo por procedimientos
Devuelve un objeto que contiene la información de definición de un campo del conjunto de resultados especificado.
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().
-
fieldnr -
El número de campo. Este valor debe estar en un rango desde 0 a número de campos - 1.
Valores devueltos
Devuelve un objeto que contiene la información de definición del campo o FALSE
si no está disponible la información del campo especificada por
fieldnr.
| Atributo | 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 |
| def | El valor predeterminado de este campo, representado como una cadena |
| max_length | El ancho máximo del campo del conjunto de resultados. |
| length | El ancho del campo, como fue especificado en la definición de la tabla. |
| charsetnr | El número del conjunto de caracteres 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("localhost", "mi_usuario", "mi_contraseña", "world");
/* comprobar la conexión */
if (mysqli_connect_errno()) {
printf("Falló la conexión: %s\n", mysqli_connect_error());
exit();
}
$consulta = "SELECT Name, SurfaceArea from Country ORDER BY Name LIMIT 5";
if ($resultado = $mysqli->query($consulta)) {
/* Obtener la información del campo para la columna 'SurfaceArea' */
$info_campo = $resultado->fetch_field_direct(1);
printf("Nombre: %s\n", $info_campo->name);
printf("Tabla: %s\n", $info_campo->table);
printf("Longitud máx.: %d\n", $info_campo->max_length);
printf("Banderas: %d\n", $info_campo->flags);
printf("Tipo: %d\n", $info_campo->type);
$resultado->close();
}
/* cerrar la conexión */
$mysqli->close();
?>
Ejemplo #2 Estilo por procedimientos
<?php
$enlace = mysqli_connect("localhost", "mi_usuario", "mi_contraseña", "world");
/* comprobar la conexión */
if (mysqli_connect_errno()) {
printf("Falló la conexión: %s\n", mysqli_connect_error());
exit();
}
$consulta = "SELECT Name, SurfaceArea from Country ORDER BY Name LIMIT 5";
if ($resultado = mysqli_query($enlace, $consulta)) {
/* Obtener la información del campo para la columna 'SurfaceArea' */
$info_campo = mysqli_fetch_field_direct($resultado, 1);
printf("Nombre: %s\n", $info_campo->name);
printf("Tabla: %s\n", $info_campo->table);
printf("Longitud máx.: %d\n", $info_campo->max_length);
printf("Banderas: %d\n", $info_campo->flags);
printf("Tipo: %d\n", $info_campo->type);
mysqli_free_result($resultado);
}
/* cerrar la conexión */
mysqli_close($enlace);
?>
El resultado de los ejemplos serían:
Nombre: SurfaceArea Tabla: Country Longitud máx.: 10 Banderas: 32769 Tipo: 4
Ver también
- mysqli_num_fields() - Obtiene el número de campos de un resultado
- mysqli_fetch_field() - Retorna el próximo campo del resultset
- mysqli_fetch_fields() - Devuelve un array de objetos que representan los campos de un conjunto de resultados
Here's a bigger list of data types. I got this by creating every type I could and calling fetch_fields():
<?php
$mysql_data_type_hash = array(
1=>'tinyint',
2=>'smallint',
3=>'int',
4=>'float',
5=>'double',
7=>'timestamp',
8=>'bigint',
9=>'mediumint',
10=>'date',
11=>'time',
12=>'datetime',
13=>'year',
16=>'bit',
//252 is currently mapped to all text and blob types (MySQL 5.0.51a)
253=>'varchar',
254=>'char',
246=>'decimal'
);
?>
note that
"SELECT <timestamp-field>, ..."
will return the field with type 7 (timestamp) but with content like "2010-07-14 14:35:08". the point being it is a string.
"SELECT <timestamp-field> + 0, ..."
returns a type 5 (double) but while a number, is not seconds since epoch, but a number in MySQL's "YYYYMMDDHHMMSS" format, in this example:
20100714143508
(PHP 5.2.12)
Beware of the fact that the ->def property NEVER gets filled with the correct default field value, so it's totally USELESS.
This happens NOT for a bug in php (so don't go filling in a bug report), but happens BY DESIGN, since the MySQL C API call doesn't fill in this value, unless you call the mysql_list_fields() function, which Php doesn't.
See here for reference.
http://dev.mysql.com/doc/refman/5.0/en/c-api-datatypes.html
Also, be aware that if you're using a query which contains subqueries, the primary key/autoincrement flags do NOT get passed along, even if the field you're looking at is the primary autoincrement key of the master table:
SELECT * from (SELECT id from areas) AS subareas
and you'll find primary key and autoinc flags off on id field, even if id was the primary autoinc key of areas table.
This also is by design, i think, since it's supposed that if we're using a subquery then the primary key/autoinc stuff might have no sense at all, since in the result set we can compose fileds from many different tables.
Hoping this is useful, bye!
I wrote a simple class to get info about fields.
Try it!
<?php
class MysqlFieldsInfo implements Iterator
{
private $result;
private $position;
private $row;
function __construct($result){
$this->result = $result;
$this->position = 0;
$this->rewind(); // W $results wewnętrzny wskaźnik może być przesunięty więc powracamy do początku
}
public function current(){
return $this->row;
}
public function next(){
$this->position++;
$this->row = $this->result->fetch_field();
}
public function valid(){
return (boolean) $this->row;
}
public function key(){
return $this->position;
}
public function rewind(){
$this->position = 0;
$this->result->field_seek(0);
$this->next();
}
// This function show data in table
public function export(){
echo '<table id="db_table_info">';
echo '<tr>
<th>Name</th>
<th>Orgname</th>
<th>Table</th>
<th>Orgtable</th>
<th>Def</th>
<th>Max_length</th>
<th>Length</th>
<th>Charsetnr</th>
<th>Flags</th>
<th>Type</th>
<th>Decimals</th>
</tr>';
while($this->valid()){
echo '<tr>';
printf("\n\t<td>%s</td>\n", $this->current()->name);
printf("\t<td>%s</td>\n", $this->current()->orgname);
printf("\t<td>%s</td>\n", $this->current()->orgtable);
printf("\t<td>%s</td>\n", $this->current()->def);
printf("\t<td>%s</td>\n", $this->current()->max_length);
printf("\t<td>%s</td>\n", $this->current()->length);
printf("\t<td>%s</td>\n", $this->current()->charsetnr);
printf("\t<td>%s</td>\n", $this->current()->flags);
printf("\t<td>%s</td>\n", $this->current()->type);
printf("\t<td>%s</td>\n", $this->current()->decimals);
echo '</tr>';
$this->next();
}
echo '</table>';
}
}
?>
According to
http://www.redferni.uklinux.net/mysql/MySQL-Protocol.html
Data type values are:
DECIMAL 0 ENUM 247
TINY 1 SET 248
SHORT 2 TINY_BLOB 249
LONG 3 MEDIUM_BLOB 250
FLOAT 4 LONG_BLOB 251
DOUBLE 5 BLOB 252
NULL 6 VAR_STRING 253
TIMESTAMP 7 STRING 254
LONGLONG 8 GEOMETRY 255
INT24 9
DATE 10
TIME 11
DATETIME 12
YEAR 13
NEWDATE 14
Note that this is not tested and does not contain
all the values noted by deluxmozart
According to
dev.mysql.com/sources/doxygen/mysql-5.1/mysql__com_8h-source.html
the flag bits are:
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 */
Here are some Numbers of Datatypes. I searched for it but i didn't find a list, where the datatypes of the numbers are listed.
so first I can give this:
3 - Int
10 - Date
246 - Decimal
252 - text
253 - VarChar
254 - Boolean
