Список PHP native_type для PDO getColumnMeta ()

Я использую библиотеку абстракции базы данных PDO, чтобы убедиться, что мой код переносим. Однако теперь я обнаружил, что мне нужна информация о столбцах, поэтому я обратился кPDOStatement- & GT; getColumnMeta () метод, надеющийся, что это будет несколько стандартизировано - но от того, что я нашел, это фактически кажется открытым.

Например, при вызове этого метода из SQLite кажется, что вы получаете один набор возможных значений:

http://gcov.php.net/PHP_5_3/lcov_html/pdo_sqlite/sqlite_statement.c.gcov.php

null
double
blob
string
integer
...

В то время как вызов из базы данных MySQL перечисляет все виды других странных значений: http://gcov.php.net/PHP_5_3/lcov_html/pdo_mysql/mysql_statement.c.gcov.php

var_string
longlong
newdecimal
geometry
...

Возможно, я тоже смотрю не в том месте, но просто не могу найти никаких полезных данных о том, что & quot; native_type & quot; Значения могут быть, когда дело доходит до переключения баз данных.

Ответы на вопрос(6)

Решение Вопроса

Это одна из тех областей PDO, которая была намеренно оставлена неопределенной, чтобы сохранить абстракцию небольшого веса.

PDO не определяет стандартное представление типов для этого метода; каждый водитель имеет свое собственное представление о том, что он может вернуть сюда.

 Xeoncross02 авг. 2009 г., 20:12
Какой позор. Почему люди используют стандартизированный уровень доступа, который не определяет какие-либо стандарты?

Я думал, что могу поделиться тем, что у меня есть. Поскольку native_type и pdo_type возвращают такие резко отличающиеся значения, я использую & quot; len & quot; попытаться проверить строки на наличие текста, так как все, что меньше 255, это var char, int или boolean. Кроме того, pdo_type имеет только 5 возможных значений.

//PDO data types
$types = array(
    PDO::PARAM_BOOL => 'bool',
    PDO::PARAM_NULL => 'null',
    PDO::PARAM_INT  => 'int',
    PDO::PARAM_STR  => 'string',
    PDO::PARAM_LOB  => 'blob',
    PDO::PARAM_STMT => 'statement'  //Not used right now
);

//Get meta
$column = $result->getColumnMeta(1);

//If the column lenght isn't set - default to ZERO
$column['len'] = isset($column['len']) ? $column['len'] : 0;

//HACK: If it is longer than 255 chars then it is a text area
if($column['len'] > 255) {
    $column['type'] = 'text';
} else {
    $column['type'] = $types[$column['pdo_type']];
}
 Xeoncross19 июл. 2009 г., 23:05
Хорошие моменты, как я уже сказал, весь этот вопрос касается попыток найти надежный способ классификации типов. Это был только один способ, которым я пытался это сделать.
 19 июл. 2009 г., 22:04
Какой именно смысл в этом? В настоящее время, например, Вы возвращаете "строку" для DATETIME в MySQL. А с другой стороны, символ (n) или символ, изменяющийся (n), может иметь n & gt; 255 в postgresql. Такif (по какой причине) эта информация была жизненно важной, она не была бы надежной (?)

Я приложил руку к тому, чтобы изменить поведение, чтобы оно более точно соответствовало документации. Вы можете обратиться кОшибка PHP # 46508.

 Xeoncross19 авг. 2009 г., 22:12
Спасибо, что еще раз упомянул эту проблему.

Один обходной путь, с которым я столкнулся, потребовал бы, чтобы вы использовали имя таблицы в качестве своего собственного псевдонима.

Вы можете вызвать getColumnMeta () и получить уникальный список таблиц, и для каждой таблицы выполнить команду «DESCRIBE {table}». заявление. Сопоставьте имя столбца с теми из вашего результирующего набора, чтобы получить фактический тип данных MySQL.

В любом случае это сработало для меня и моих потребностей ...

 Xeoncross09 сент. 2009 г., 19:21
Вы имеете в виду, использовать имя столбца в качестве своего псевдонима? Это было бы довольно архаично - но я думаю, это сработало бы.

Это больше работы, но создать базу данных с именами столбцов, такими как vc_20_Last_Name. Затем взорвите имя столбца на & quot; _ & quot ;. Позиция ноль содержит VC или VARCHAR. Позиция 1 содержит ширину столбца или 20. Позиция 2 и выше содержит Фамилию и Имя, что самоочевидно. Теперь у вас есть возможность написать универсальную функцию для автоматического создания HTML-форм для операций INSERT, UPDATE и DELETE. Вы можете передать параметры, чтобы исключить (или включить, если это проще) поля, которые вы не хотите показывать. Напишите код один раз и используйте его навсегда. Не повезло, если вы застряли за чужими столами.

PDO естьnot абстракция базы данных. Это "только" уровень унифицированного доступа. Если вы переключаетесь на другую систему баз данных, вам, скорее всего, придется изменить код. Каждый (конкретный) драйвер базы данных возвращает свой собственный набор значений, и «слой перевода» отсутствует ». для драйвера: информация decl_type в pdo за пределами полей native_type / pdo_type в результате getColumnMeta ()

 Xeoncross19 июл. 2009 г., 21:44
Я полагаю, что вы не видели мой комментарий выше;)
 19 июл. 2009 г., 21:57
извините, вы правы, я не имею ;-)
 19 июл. 2009 г., 21:26
Это, вероятно, будет тогда pdo_type. То есть PDO :: PARAM_BOOL, PDO :: PARAM_NULL, ... см.php.net/pdo.constants
 Xeoncross19 июл. 2009 г., 19:49
Извините, я создал слой абстракции базы данных поверх PDO - это то, что я имел в виду. Во всяком случае, звучит так, как будто вы говорите, что поля native_type / pdo_type несколько унифицированы, верно? Что существует установленное количество типов, которые могут быть возвращены?

Ваш ответ на вопрос