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+ 驅動程式支援此方法。它可以用於物件水合 (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)
{
//利用 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

找到了與此函式相關的簡短討論。
我還沒試過(還嗎?),但希望有人覺得它有用。
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()
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",
4 年前

SQL Server 也支援這個方法(至少 PDO 驅動程式 5.7.1 版支援)

範例
array(8) {
["flags"]=>
["sqlsrv:decl_type"]=>
string(12) "int identity"

=> 字串(12) "int identity" (自動遞增整數)
["native_type"]=>
string(6) "string"

=> 字串(6) "string" (字串)
["table"]=>
string(0) ""

=> 字串(0) "" (空字串)
["pdo_type"]=>
int(2)

=> 整數(2)
["name"]=>
string(8) "IdCompra"

=> 字串(8) "IdCompra" (購買ID)
["len"]=>
int(10)

=> 整數(10)
["precision"]=>
["flags"]=>
}
frankno dot 94 at gmail dot com

=> frankno dot 94 at gmail dot com (此處保留原文,因為是 email 地址的表示方式)
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.

=> 我最近在一個小函式中加了一段註釋,該函式會遍歷 PDOStatement::fetch 的結果,并将欄位映射到整數或浮點數類型。

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.

=> 這個網站不允許我編輯原始評論,所以我乾脆放一個 gist 的連結,以便後續需要更多修正。

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

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


I basically added this code

=> 我基本上加了這段程式碼

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

=> <?php
if ($value === null) {
continue;
}
?> (程式碼部分保留原文)
To Top