【问题标题】:List of PHP native_type's for PDO getColumnMeta()PDO getColumnMeta() 的 PHP native_type 列表
【发布时间】:2010-11-12 00:54:33
【问题描述】:

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

【问题讨论】:

    标签: php database pdo


    【解决方案1】:

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

    【讨论】:

    • 对不起,我在 PDO 上构建了一个数据库抽象层——这就是我所指的。无论如何,听起来您是在说 native_type/pdo_type 字段有些统一对吗?可以返回一定数量的类型吗?
    • 那可能是 pdo_type 。 IE。 PDO::PARAM_BOOL,PDO::PARAM_NULL, ...见php.net/pdo.constants
    • 我猜你没有看到我上面的评论;)
    【解决方案2】:

    我想我可以分享我目前所拥有的。由于 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']];
    }
    

    【讨论】:

    • 这到底有什么意义?目前例如您在 MySQL 中为 DATETIME 返回“字符串”。另一方面,一个字符(n)或字符变化(n)在postgresql中可以有一个n>255。所以如果(出于什么原因)这个信息是至关重要的,它不会是可靠的(?)
    • 好点,就像我说的那样,整个问题是关于试图找到一种对类型进行分类的可靠方法。这只是我尝试的一种方式。
    【解决方案3】:

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

    PDO 没有为此方法定义类型的标准表示;每个驱动程序对于它可以在这里返回什么都有自己的想法。

    【讨论】:

    • 真可惜。为什么人们会使用没有定义任何标准的标准化访问层?
    【解决方案4】:

    我亲手改变了行为以更贴合文档。你可以参考PHP Bug #46508

    【讨论】:

    • 感谢您再次提及这个问题。
    【解决方案5】:

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

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

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

    【讨论】:

    • 你的意思是,使用列名作为它自己的别名?那会很陈旧——但我想这会奏效。
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 2013-05-12
      • 2016-06-09
      • 2018-05-03
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多