PHP 8.5.0 Alpha 1 available for testing

PDOStatement::getColumnMeta

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)

PDOStatement::getColumnMeta Devuelve las metadatos para una columna de un conjunto de resultados

Descripción

public PDOStatement::getColumnMeta(int $column): array|false

Recupera las metadatos para una columna de un conjunto de resultados en un array asociativo.

Advertencia

Algunos controladores pueden no implementar la función PDOStatement::getColumnMeta(), ya que es opcional. Sin embargo, todos los controladores PDO documentados en el manual implementan esta función.

Parámetros

column

El nombre de la columna en el conjunto de resultados.

Valores devueltos

Devuelve un array asociativo que contiene los siguientes valores representando las metadatos para una columna:

Metadatos de una columna
Nombre Valor
native_type El tipo nativo de PHP utilizado para representar el valor de la columna.
driver:decl_type El tipo SQL utilizado para representar el valor de la columna en la base de datos. Si la columna del conjunto de resultados es el resultado de una función, este valor no es devuelto por la función PDOStatement::getColumnMeta().
flags Cualquier flag definido para esta columna.
name El nombre de esta columna, como es devuelto por la base de datos.
table El nombre de la tabla de esta columna, tal como es devuelto por la base de datos.
len La longitud de esta columna. Normalmente, -1 para tipos distintos a los números decimales de punto flotante.
precision La precisión numérica para esta columna. Normalmente, 0 para tipos distintos a los números decimales de punto flotante.
pdo_type El tipo de esta columna como es representado por la constante PDO::PARAM_*.

Devuelve false si la columna solicitada no existe en el conjunto de resultados, o si no existe ningún conjunto de resultados.

Ejemplos

Ejemplo #1 Recuperación de las metadatos para una columna

El siguiente ejemplo muestra el resultado de la recuperación de las metadatos para una columna generada por una función (COUNT) en un controlador PDO_SQLITE.

<?php
$select
= $DB->query('SELECT COUNT(*) FROM fruit');
$meta = $select->getColumnMeta(0);
var_dump($meta);
?>

El resultado del ejemplo sería:

array(6) {
   ["native_type"]=>
   string(7) "integer"
   ["flags"]=>
      array(0) {
      }
   ["name"]=>
   string(8) "COUNT(*)"
   ["len"]=>
   int(-1)
   ["precision"]=>
   int(0)
   ["pdo_type"]=>
   int(2)
}

Ver también

add a note

User Contributed Notes 6 notes

up
12
colin at fusionbox dot com
16 years ago
This method is supported in the MySQL 5.0+ driver. It can be used for object hydration:

<?php

$pdo_stmt
= $dbh->execute('SELECT discussion.id, discussion.text, comment.id, comment.text FROM discussions LEFT JOIN comments ON comment.discussion_id = discussion.id');

foreach(
range(0, $pdo_stmt->columnCount() - 1) as $column_index)
{
$meta[] = $pdo_stmt->getColumnMeta($column_index);
}

while(
$row = $pdo_stmt->fetch(PDO::FETCH_NUM))
{
foreach(
$row as $column_index => $column_value)
{
//do something with the data, using the ids to establish the discussion.has_many(comments) relationship.
}
}

?>

If you are building an ORM, this method is very useful to support more natural SQL syntax. Most ORMs require the column names to be aliases so that they can be parsed and turned into objects that properly represent has_one, has_many, many_to_many relationships.
up
4
asohn aircanopy net
17 years ago
I found a short discussion related to this function at
http://www.sitepoint.com/forums/showthread.php?t=497257

I haven't tried it (yet?) but hopefully someone can find it useful.
up
2
Rodrigo Silva
5 years ago
native_type has the following mapping for MySQL:
(tested in PHP 5.4, MySQL 5.7)

INT(11) (PKs) => LONG
TINYINT(4) => TINY
DOUBLE => DOUBLE
VARCHAR => VAR_STRING
CHAR => STRING
DATE => DATE
Functions => VAR_STRING
- DATEFORMAT()
- CONCAT()
up
0
samer dot mhana at gmail dot com
3 years ago
Searching for LONGLONG in php-src:

$datatypes = array(
MYSQLI_TYPE_TINY => "TINY",
MYSQLI_TYPE_SHORT => "SHORT",
MYSQLI_TYPE_LONG => "LONG",
MYSQLI_TYPE_FLOAT => "FLOAT",
MYSQLI_TYPE_DOUBLE => "DOUBLE",
MYSQLI_TYPE_TIMESTAMP => "TIMESTAMP",
MYSQLI_TYPE_LONGLONG => "LONGLONG",
MYSQLI_TYPE_INT24 => "INT24",
MYSQLI_TYPE_DATE => "DATE",
MYSQLI_TYPE_TIME => "TIME",
MYSQLI_TYPE_DATETIME => "DATETIME",
MYSQLI_TYPE_YEAR => "YEAR",
MYSQLI_TYPE_ENUM => "ENUM",
MYSQLI_TYPE_SET => "SET",
MYSQLI_TYPE_TINY_BLOB => "TINYBLOB",
MYSQLI_TYPE_MEDIUM_BLOB => "MEDIUMBLOB",
MYSQLI_TYPE_LONG_BLOB => "LONGBLOB",
MYSQLI_TYPE_BLOB => "BLOB",
MYSQLI_TYPE_VAR_STRING => "VAR_STRING",
MYSQLI_TYPE_STRING => "STRING",
MYSQLI_TYPE_NULL => "NULL",
MYSQLI_TYPE_NEWDATE => "NEWDATE",
MYSQLI_TYPE_INTERVAL => "INTERVAL",
MYSQLI_TYPE_GEOMETRY => "GEOMETRY",
);
up
0
jcastromail at yahoo dot es
5 years ago
This method is supported by sql server too (at least the version of the PDO driver 5.7.1)

Example:

array(8) {
["flags"]=>
int(0)
["sqlsrv:decl_type"]=>
string(12) "int identity"
["native_type"]=>
string(6) "string"
["table"]=>
string(0) ""
["pdo_type"]=>
int(2)
["name"]=>
string(8) "IdCompra"
["len"]=>
int(10)
["precision"]=>
int(0)
}
up
0
frankno dot 94 at gmail dot com
5 years ago
I recently added a note to a small function that went through the results of PDOStatement::fetch and mapped columns to integer or float types.

I forgot to test for columns that can have a null value!

I'm updating the code here, sorry.

This website doesn't let me edit the original comment, so I'm just gonna link to a gist in case it needs even further fixes.

https://gist.github.com/AeonFr/db3b2a8a95753076d9e4da42d29365d2

I basically added this code:

<?php
if ($value === null) {
continue;
}
?>
To Top