5

我正在使用 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”值可能是什么的有用数据。

4

6 回答 6

3

PDO不是数据库抽象。它“只是”一个统一的接入层。如果您切换到另一个数据库系统,您很可能必须更改代码。每个(特定)数据库驱动程序都返回自己的一组值,并且驱动程序没有“转换层”:pdo 中的 decl_type 信息超出 getColumnMeta() 结果中的 native_type/pdo_type 字段

于 2009-07-19T11:48:03.373 回答
3

这是故意未定义的 PDO 领域之一,以保持抽象的轻量级。

PDO 没有为此方法定义类型的标准表示;每个驱动程序对可以返回的内容都有自己的想法。

于 2009-08-01T23:13:46.413 回答
1

我亲手改变了行为以更贴合文档。您可能需要参考PHP 错误 #46508

于 2009-08-14T19:22:47.090 回答
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']];
}
于 2009-07-19T17:54:51.640 回答
0

我遇到的一种解决方法是要求您使用表名作为其自己的别名。

您可以调用 getColumnMeta() 并获取唯一的表列表,并为每个表执行“DESCRIBE {table}”语句。将列名与结果集中的列名匹配,以获得实际的 MySQL 数据类型。

无论如何,它对我和我的需求都有效......

于 2009-09-08T19:50:12.927 回答
0

它的工作量更大,但要使用 vc_20_Last_Name 之类的列名创建数据库。然后在“_”上展开列名。位置零包含 vc 或 VARCHAR。位置 1 包含列宽或 20。位置 2 及以上包含姓氏和名称,这是不言自明的。您现在可以编写一个通用函数来自动构建用于 INSERT、UPDATE 和 DELETE 操作的 HTML 表单。您可以传递参数以排除(或包含如果更容易)您不想/不想出现的字段。一次编写代码并永远使用它。如果你被别人的桌子困住了,那可真倒霉。

于 2014-07-24T07:35:08.270 回答