我正在使用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”值的任何有用数据。
答案 0 :(得分:3)
PDO 不是数据库抽象。它“仅”是一个统一的访问层。如果切换到另一个数据库系统,则很可能需要更改代码。每个(特定)数据库驱动程序返回其自己的一组值,并且驱动程序没有“转换层”:pdo中的decl_type信息超出了getColumnMeta()
结果中的native_type / pdo_type字段答案 1 :(得分:3)
这是PDO中有意未定义的区域之一,以保持抽象的轻量化。
PDO没有为此方法定义类型的标准表示;每个司机都有自己的想法,可以回到这里。
答案 2 :(得分:1)
我亲自将行为更改为更贴合文档。您可能需要参考PHP Bug #46508。
答案 3 :(得分:0)
我认为我可以分享到目前为止所拥有的东西。由于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']];
}
答案 4 :(得分:0)
我遇到的一个解决方法是要求您使用表名作为自己的别名。
您可以调用getColumnMeta()并获取一个唯一的表列表,并为每个表执行'DESCRIBE {table}'语句。将列名与结果集中的列名匹配,以获得实际的MySQL数据类型。
无论如何,它对我和我的需求都有用......
答案 5 :(得分:0)
它的工作量更大,但是使用vc_20_Last_Name等列名创建数据库。然后在" _"上爆炸列名称。位置零包含vc或VARCHAR。位置1包含列宽或20.位置2及以上包含Last和Name,这是自解释的。您现在可以编写一个通用函数来自动构建INSERT,UPDATE和DELETE操作的HTML表单。您可以传递参数以排除(或包括它是否更容易)您不想/想要出现的字段。编写一次代码并永远使用它。如果你被别人的桌子困住,那就太好了。