Список PHP native_type для PDO getColumnMeta () - PullRequest
5 голосов
/ 19 июля 2009

Я использую библиотеку абстракции базы данных PDO, чтобы убедиться, что мой код переносим. Однако теперь я обнаружил, что мне нужна информация о столбцах, поэтому я обратился к методу PDOStatement-> 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
...

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

Ответы [ 6 ]

3 голосов
/ 02 августа 2009

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

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

3 голосов
/ 19 июля 2009

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

1 голос
/ 14 августа 2009

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

0 голосов
/ 24 июля 2014

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

0 голосов
/ 08 сентября 2009

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

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

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

0 голосов
/ 19 июля 2009

Я думал, что смогу поделиться тем, что у меня есть. Поскольку native_type и pdo_type возвращают такие резко отличающиеся значения, я использую «len», чтобы попытаться проверить строки на наличие текста и текста, поскольку все, что меньше 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']];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...