PDO的PHP native_type列表getColumnMeta()

时间:2009-07-18 22:47:02

标签: php database pdo

我正在使用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 个答案:

答案 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表单。您可以传递参数以排除(或包括它是否更容易)您不想/想要出现的字段。编写一次代码并永远使用它。如果你被别人的桌子困住,那就太好了。