PDOStatement::getColumnMeta
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.2.0)
PDOStatement::getColumnMeta — 結果セットのカラムに対するメタデータを返す
説明
結果セットの 0 から始まるカラムに対するメタデータを連想配列で取得します。
警告
PDO ドライバによっては、 PDOStatement::getColumnMeta() を実装していないかもしれません。 なぜなら、これはオプションだからです。 しかし、このマニュアルでドキュメント化されている全ての PDO ドライバ はこの関数を実装しています。
パラメータ
column
-
結果セットの 0 から始まるカラムを指定します。
戻り値
1つのカラムについてのメタデータに相当する次の値を含んだ連想配列を返します。
名前 | 値 |
---|---|
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) }
参考
- PDOStatement::columnCount() - 結果セット中のカラム数を返す
- PDOStatement::rowCount() - 直近の SQL ステートメントによって作用した行数を返す
+add a note
User Contributed Notes 6 notes
colin at fusionbox dot com ¶
15 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.
asohn aircanopy net ¶
16 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.
Rodrigo Silva ¶
5 years 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()
samer dot mhana at gmail dot com ¶
3 years ago
Searching for LONGLONG in php-src:
$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 years ago
This method is supported by sql server too (at least the version of the PDO driver 5.7.1)
Example:
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 years 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;
}
?>