PHPWales 2020 - June 3rd to June 4th

PDOStatement->getColumnMeta

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

PDOStatement->getColumnMetaSonuç kümesindeki bir sütunla ilgili temel veriyi döndürür

Açıklama

PDOStatement::getColumnMeta ( int $sütun ) : array
Uyarı

Bu işlev DENEYSELDİR. Bu işlevin davranışı, ismi ve belgeleri PHP'nin sonraki sürümlerinde hiçbir duyuru yapılmaksızın değiştirilebilir. Bu riski göze alamayacaksanız bu işlevi kullanmayın.

Sütun numarası belirtilen sütunla ilgili temel verileri içeren bir ilişkisel dizi döndürür.

Uyarı

PDOStatement::getColumnMeta() yöntemini her veritabanı sürücüsü desteklemez.

Değiştirgeler

sütun

Sütun numarası; ilk sütunun numarası 0'dır.

Dönen Değerler

Aşağıdaki alanlara sahip bir ilişkisel dizi döner:

Sütun temel verisi
İsim Değerin açıklaması
native_type Sütun değerinin PHP veri türü.
driver:decl_type Veritabanındaki sütun değerinin SQL veri türü. Eğer sonuç kümesindeki sütun bir işlevin sonucu ise bu değer PDOStatement::getColumnMeta() tarafından döndürülmez.
flags Bu sütun için tanımlı seçenek kümesi.
isim Sütunun ismi.
table Sütunu içeren tablonun ismi.
len Sütunun genişliği. Onluk gerçek sayılar dışındaki türler için normalde -1'dir.
precision Sütunun sayısal hassasiyeti. Onluk gerçek sayılar dışındaki türler için normalde 0'dır.
pdo_type Sütun türünü gösteren PDO::PARAM_* sabitlerinden biri.

İstenen sütun sonuç kümesinde yoksa veya hiç sonuç kümesi yoksa FALSE döner.

Sürüm Bilgisi

Sürüm: Açıklama
5.2.3 Dönen diziye table alanı eklendi.

Örnekler

Örnek 1 - Sütun temel verilerinin alınması

Aşağıdaki örnekte bir PDO_SQLITE sürücüsünde bir işlev (COUNT) tarafından üretilen sonuç kümesindeki tek sütunla ilgili temel verilerin elde edilmesi gösterilmiştir.

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

Yukarıdaki örneğin çıktısı:

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

Ayrıca Bakınız

add a note add a note

User Contributed Notes 5 notes

up
10
colin at fusionbox dot com
10 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
11 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
Rodrigo Silva
4 months 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
3 months 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
frankno dot 94 at gmail dot com
4 months 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