(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)
PDOStatement::getColumnMeta — 返回结果集中一列的元数据
$column
)此函数是实验性的。此函数的表象,包括名称及其相关文档都可能在未来的 PHP 发布版本中未通知就被修改。使用本函数风险自担 。
检索一个在结果集中以0开始索引的列的元数据作为一个关联数组。
并非所有 PDO 驱动都支持 PDOStatement::getColumnMeta()。
column
结果集中以0开始索引的列。
返回一个关联数组,它包含了下列表示一个单独列的元数据的值:
名称 | 值 |
---|---|
native_type | 用于表示列值的 PHP 原生类型。 |
driver:decl_type | 在数据库中用于表示列值的 SQL 类型。如果结果集中的列是一个函数的结果,则该值不能被 PDOStatement::getColumnMeta() 返回。 |
flags | 任何设置于此列的标记。 |
name | 通过数据库返回的列名。 |
table | 通过数据库返回的该列的表名 |
len | 该列的长度。除浮点小数外通常为 -1 |
precision | 该列的数值精度。除浮点小数外通常为 0 。 |
pdo_type | 以 PDO::PARAM_* 常量为代表的列类型。 |
如果结果集不存在,或者是请求的列在结果集中不存在,则返回 FALSE
。
版本 | 说明 |
---|---|
5.2.3 | table 字段 |
Example #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) }
colin at fusionbox dot com (2009-01-23 10:38:44)
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.
asohn aircanopy net (2008-02-29 09:21:22)
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.