PDOStatement::getColumnMeta
(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 тип значения столбца в виде одной из констант PDO::PARAM_*. |
Возвращает FALSE
в случаях, когда указанного столбца нет в результирующей
таблице, а также если не существует самого результирующего набора.
Список изменений
Версия | Описание |
---|---|
5.2.3 | Поле table |
Примеры
Пример #1 Извлечение метаданных столбца
В следующем примере показаны результаты извлечения метаданных одного столбца сгенерированного функцией COUNT драйвера PDO_SQLITE.
<?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 запросом
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Уровни абстракции
- Объекты данных PHP
- Функция PDOStatement::bindColumn() - Связывает столбец с PHP переменной
- Функция PDOStatement::bindParam() - Привязывает параметр запроса к переменной
- Функция PDOStatement::bindValue() - Связывает параметр с заданным значением
- Функция PDOStatement::closeCursor() - Закрывает курсор, переводя запрос в состояние готовности к повторному запуску
- Функция PDOStatement::columnCount() - Возвращает количество столбцов в результирующем наборе
- Функция PDOStatement::debugDumpParams() - Вывод информации о подготовленной SQL команде в целях отладки
- Функция PDOStatement::errorCode() - Определяет SQLSTATE код соответствующий последней операции объекта PDOStatement
- PDOStatement::errorInfo
- Функция PDOStatement::execute() - Запускает подготовленный запрос на выполнение
- Функция PDOStatement::fetch() - Извлечение следующей строки из результирующего набора
- Функция PDOStatement::fetchAll() - Возвращает массив, содержащий все строки результирующего набора
- Функция PDOStatement::fetchColumn() - Возвращает данные одного столбца следующей строки результирующего набора
- Функция PDOStatement::fetchObject() - Извлекает следующую строку и возвращает ее в виде объекта
- Функция PDOStatement::getAttribute() - Получение значения атрибута запроса PDOStatement
- Функция PDOStatement::getColumnMeta() - Возвращает метаданные столбца в результирующей таблице
- Функция PDOStatement::nextRowset() - Переход к следующему набору строк в результате запроса
- Функция PDOStatement::rowCount() - Возвращает количество строк, модифицированных последним SQL запросом
- Функция PDOStatement::setAttribute() - Присваивает атрибут объекту PDOStatement
- Функция PDOStatement::setFetchMode() - Задает режим выборки по умолчанию для объекта запроса
Коментарии
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.
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.
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()
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;
}
?>
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)
}
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",
);