PDOStatement::getColumnMeta

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

PDOStatement::getColumnMeta返回结果集中列的元数据

说明

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

将结果集中第 0 个索引的列的元数据作为关联数组检索。

警告

某些驱动程序可能未实现 PDOStatement::getColumnMeta(),因为它是可选的。但是,手册中记录的所有 PDO 驱动程序 都实现了此函数。

参数

column

结果集中的第 0 个索引的列。

返回值

返回一个关联数组,其中包含以下表示单个列元数据的的值

列元数据
名称
native_type 用于表示列值的 PHP 本机类型。
driver:decl_type 用于在数据库中表示列值的 SQL 类型。如果结果集中的列是函数的结果,则此值不会由 PDOStatement::getColumnMeta() 返回。
flags 为此列设置的任何标志。
name 此列的名称,由数据库返回。
table 此列所在表的名称,由数据库返回。
len 此列的长度。对于除浮点小数以外的其他类型,通常为 -1
precision 此列的数字精度。对于除浮点小数以外的其他类型,通常为 0
pdo_type 此列的类型,由 PDO::PARAM_* 常量 表示。

如果请求的列在结果集中不存在,或者没有结果集,则返回 false

示例

示例 #1 检索列元数据

以下示例显示了检索由 PDO_SQLITE 驱动程序中的函数 (COUNT) 生成的单个列的元数据的结果。

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

上面的示例将输出

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

参见

添加备注

用户贡献笔记 7 个笔记

colin at fusionbox dot com
15 年前
此方法在 MySQL 5.0+ 驱动程序中受支持。它可以用于对象水合

<?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)
{
//使用 id 建立 discussion.has_many(comments) 关系来处理数据。
}
}

?>

如果您正在构建 ORM,此方法非常有用,可以支持更自然的 SQL 语法。大多数 ORM 要求列名称是别名,以便它们可以被解析并转换为正确表示 has_one、has_many、many_to_many 关系的对象。
asohn aircanopy net
16 年前
我在以下位置找到了与该函数相关的简短讨论
http://www.sitepoint.com/forums/showthread.php?t=497257

我还没有尝试过(还没有?),但希望有人能发现它有用。
samer dot mhana at gmail dot com
3 年前
在 php-src 中搜索 LONGLONG

$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",
);
Rodrigo Silva
5 年前
native_type 对于 MySQL 有以下映射
(在 PHP 5.4、MySQL 5.7 中测试)

INT(11) (PKs) => LONG
TINYINT(4) => TINY
DOUBLE => DOUBLE
VARCHAR => VAR_STRING
CHAR => STRING
DATE => DATE
函数 => VAR_STRING
- DATEFORMAT()
- CONCAT()
frankno dot 94 at gmail dot com
4 年前
我最近在一个小型函数中添加了一个注释,该函数遍历 PDOStatement::fetch 的结果并将列映射到整数或浮点类型。

我忘记测试可以具有空值的列了!

我在这里更新代码,抱歉。

此网站不允许我编辑原始注释,因此我将链接到一个 gist 以防它需要进一步修复。

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

我基本上添加了以下代码

<?php
if ($value === null) {
continue;
}
?>
jcastromail at yahoo dot es
4 年前
此方法也受 sql server 支持(至少支持 PDO 驱动程序 5.7.1 的版本)

示例

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)
}
frankno dot 94 at gmail dot com
5 年前
我能够成功地在 PDO 中完成基本的整数和浮点值的类型转换。

NULL 值返回为 null,但整数和浮点数不是,因此我决定采用一个简单的解决方案。

它没有在所有数据库类型上进行测试,因此如果您认为它需要改进,请告诉我(我的推特是“francanobr”)

<?php

// 返回 $stm (PDO 语句) 的内容
// 作为关联数组,其中包含整数、空值和浮点数的正确原生类型

$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;
?>

代码示例是函数的一部分,没有包含函数声明,请评估如何将其整合到您的应用程序中。
To Top