PHP Conference Japan 2024

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)
}

参见

添加注释

用户贡献的注释 6 个注释

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

我还没有尝试过(尚未?)但希望有人能发现它有用。
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()
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",
);
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 年前
我最近在一个小函数中添加了一个注释,该函数遍历 PDOStatement::fetch 的结果并将列映射到整数或浮点类型。

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

我正在更新此处的代码,抱歉。

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

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

我基本上添加了这段代码

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