PDOStatement::getColumnMeta

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

PDOStatement::getColumnMeta Liefert die Metadaten zu einer Spalte einer Ergebnismenge

Beschreibung

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

Ruft die Metadaten für eine Spalte (beginnend bei 0) einer Ergebnismenge als assoziatives Array ab.

Warnung

Da PDOStatement::getColumnMeta() optional ist, kann es sein, dass manche Treiber es nicht implementieren. Allerdings wird diese Funktion von allen im Handbuch dokumentierten PDO-Treibern implementiert.

Parameter-Liste

column

Die Spalte der Ergebnismenge (beginnend bei 0)

Rückgabewerte

Gibt ein assoziatives Array mit den folgenden Werten zurück, die die Metadaten für eine einzelne Spalte darstellen:

Die Metadaten einer Spalte
Name Wert
native_type Der PHP-eigene Typ, der zur Darstellung des Spaltenwerts verwendet wird
driver:decl_type Der SQL-Typ, der verwendet wird, um den Spaltenwert in der Datenbank darzustellen. Wenn die Spalte in der Ergebnismenge das Ergebnis einer Funktion ist, wird dieser Wert nicht von PDOStatement::getColumnMeta() zurückgegeben.
flags Alle für diese Spalte gesetzten Flags
name Der Name der Spalte, wie er von der Datenbank zurückgegeben wird
table Der Name der Tabelle der Spalte, wie er von der Datenbank zurückgegeben wird
len Die Breite der Spalte. Für andere Typen als Gleitkommazahlen normalerweise -1.
precision Die numerische Genauigkeit der Spalte. Für andere Typen als Gleitkommazahlen normalerweise 0.
pdo_type Der Typ der Spalte, wie er durch die PDO::PARAM_*-Konstanten dargestellt wird

Gibt false zurück, wenn die angeforderte Spalte in der Ergebnismenge nicht vorhanden ist, oder wenn es keine Ergebnismenge gibt.

Beispiele

Beispiel #1 Abrufen der Metadaten einer Spalte

Das folgende Beispiel zeigt das Ergebnis des Abrufs von Metadaten für eine einzelne Spalte, die von der Funktion COUNT des PDO_SQLITE-Treibers erzeugt wurde.

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

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

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

Siehe auch

add a note add a note

User Contributed Notes 7 notes

up
12
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
3
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
2
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
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
0
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
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
-8
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