PHPCon Poland 2024

PDOStatement::getColumnMeta

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

PDOStatement::getColumnMeta Retorna metadados para uma coluna no resultado

Descrição

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

Retorna metadados para uma coluna no resultado, indexada a partir de 0, como um array associativo.

Aviso

Alguns drivers podem não implementar o método PDOStatement::getColumnMeta(), já que ele é opcional. Entretanto, todo os drivers PDO documentados neste manual implementam este método.

Parâmetros

column

A coluna no resultado, indexada a partir de 0.

Valor Retornado

Retorna um array associativo contendo os seguintes valores que representam os metadados para uma única coluna:

Metadados de coluna
Nome Valor
native_type O tipo de dados nativo do PHP usado para representar o valor da coluna.
driver:decl_type O tipo de dados SQL usado para representar o valor da coluna no banco de dados. Se a coluna for resultado de uma função, este valor não será retornado por PDOStatement::getColumnMeta().
flags Quaisquer opções configuradas para esta coluna.
name O nome desta coluna como retornado pelo banco de dados.
table O nome da tabela desta coluna como retornado pelo banco de dados.
len O comprimento desta coluna. Normalmente -1 para tipos que não sejam números com decimais.
precision A precisão numérica desta coluna. Normalmente 0 para tipos que não sejam números decimais.
pdo_type O tipo desta coluna como representado pelas constantes PDO::PARAM_*.

Retorna false se a coluna requisitada não existir no resultado ou se não existir resultado.

Exemplos

Exemplo #1 Recuperando metadados de coluna

O exemplo a seguir mostra o resultado da recuperação de metadados para uma única coluna gerada por uma função (COUNT) em um driver PDO_SQLITE.

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

O exemplo acima produzirá:

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

Veja Também

add a note

User Contributed Notes 7 notes

up
11
colin at fusionbox dot com
15 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
16 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
1
samer dot mhana at gmail dot com
2 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
1
Rodrigo Silva
4 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
frankno dot 94 at gmail dot com
4 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;
}
?>
up
-1
jcastromail at yahoo dot es
4 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
-10
frankno dot 94 at gmail dot com
4 years ago
I was able to successfully pull off basic type conversion for integer and float values in PDO.

NULL values were returning as null, but integers and floats weren't, so I decided to go with a simple solution.

It's not tested on all database types, so if you think it needs improvement, let me know (my twitter is "francanobr")

<?php

// Returns the contents of $stm (PDO Statement)
// as an associative array, with correct native types
// for integers, nulls, and floats

$array = [];

while (
$fila = $stm->fetch(\PDO::FETCH_ASSOC)) {

$i = 0;
foreach (
$fila as $key => $value) {
$columnMeta = $stm->getColumnMeta($i);

switch (
$columnMeta['native_type']) {
case
'LONG':
case
'TINY':
$fila[$key] = intval($value);
break;
case
'DOUBLE':
$fila[$key] = floatval($value);
break;
}

$i++;
}

$array[] = $fila;
}

return
$array;
?>

The code sample is part of a function, the function declaration is not included, evaluate how to integrate it with your app.
To Top