Я использую библиотеку абстракции базы данных 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» могут быть, когда дело доходит до переключения баз данных.
Это одна из тех областей PDO, которые были оставлены намеренно неопределенными, чтобы сохранить абстракцию легкой.
PDO не определяет стандартное представление типов для этого метода; у каждого водителя есть своя идея о том, что она может вернуть здесь.
PDO не является абстракцией базы данных. Это «только» единый уровень доступа. Если вы переключитесь на другую систему баз данных, вам, скорее всего, придется изменить код. Каждый (конкретный) драйвер базы данных возвращает свой собственный набор значений, и для драйвера нет «уровня перевода»: информация decl_type в pdo вне полей native_type / pdo_type в результате getColumnMeta ()
У меня была рука, чтобы изменить поведение, чтобы более точно соответствовать документации. Вы можете обратиться к PHP Bug # 46508 .
Одно из решений, с которыми я столкнулся, потребует, чтобы вы использовали имя таблицы как свой собственный псевдоним.
Вы можете вызвать getColumnMeta () и получить уникальный список таблиц, а для каждой таблицы выполнить инструкцию DESCRIBE {table}. Сопоставьте имя столбца с данными из набора результатов, чтобы получить фактический тип данных MySQL.
Это все равно работало для меня и моих потребностей …
Это больше работает, но создайте базу данных с именами столбцов, такими как vc_20_Last_Name. Затем взорвите имя столбца на «_». Позиция 0 содержит vc или VARCHAR. Позиция 1 содержит ширину столбца или 20. Позиция 2 и выше содержит Last и Name, которые являются пояснительными. Теперь у вас есть возможность написать общую функцию для автоматической сборки HTML-форм для операций INSERT, UPDATE и DELETE. Вы можете передавать параметры, чтобы исключить (или включить, если это проще) поля, которые вы / не хотите показывать. Напишите код один раз и используйте его навсегда. Жесткая удача, если вы застряли с чужими столами.
Я думал, что могу поделиться тем, что у меня есть. Поскольку 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']]; }