Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP原生类型的列表';用于PDO getColumnMeta()的s_Php_Database_Pdo - Fatal编程技术网

PHP原生类型的列表';用于PDO getColumnMeta()的s

PHP原生类型的列表';用于PDO getColumnMeta()的s,php,database,pdo,Php,Database,Pdo,我正在使用PDO数据库抽象库来确保我的代码是可移植的。然而,我现在发现我需要列信息,所以我转向了这个方法,希望它能有些标准化——但从我发现的情况来看,它实际上似乎是开放的 例如,从SQLite调用该方法时,您似乎得到了一组可能的值: 来自MySQL数据库的调用会列出各种其他奇怪的值: 我可能也找错了地方,但我就是找不到任何有用的数据来说明在数据库之间切换时“原生类型”值可能是什么。它“只是”一个统一的访问层。如果切换到另一个数据库系统,则很可能需要更改代码。每个(特定的)数据库驱动程序都返回

我正在使用PDO数据库抽象库来确保我的代码是可移植的。然而,我现在发现我需要列信息,所以我转向了这个方法,希望它能有些标准化——但从我发现的情况来看,它实际上似乎是开放的

例如,从SQLite调用该方法时,您似乎得到了一组可能的值:

来自MySQL数据库的调用会列出各种其他奇怪的值:


我可能也找错了地方,但我就是找不到任何有用的数据来说明在数据库之间切换时“原生类型”值可能是什么。它“只是”一个统一的访问层。如果切换到另一个数据库系统,则很可能需要更改代码。每个(特定的)数据库驱动程序都返回自己的一组值,并且驱动程序没有“转换层”:除了getColumnMeta()结果中的本机类型/pdo类型字段之外,pdo中没有decl类型信息。

我想我可以分享到目前为止我所拥有的。由于native_type和pdo_type返回的值截然不同,因此我使用“len”尝试测试字符串与文本,因为小于255的所有内容都是var char、int或boolean。此外,pdo_类型只有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']];
}

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


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

我参与了改变行为,使其更符合文档。您可能需要参考。

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

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


这对我和我的需求都很有用…

这需要更多的工作,但要用vc\u 20\u Last\u Name这样的列名创建数据库。然后在“\u1”上分解列名。位置0包含vc或VARCHAR。位置1包含列宽或20。位置2及以上包含姓氏和姓名,这是不言自明的。现在,您可以编写一个通用函数来自动构建用于插入、更新和删除操作的HTML表单。您可以传递参数以排除(或者更容易的话包括)您不想/不想显示的字段。编写一次代码,并永远使用它。如果你被别人的表缠住了,那就倒霉了。

对不起,我在PDO上构建了一个数据库抽象层——这就是我所指的。不管怎么说,听起来你是在说原生类型/pdo类型字段是如何统一的,对吗?可以返回一定数量的类型吗?那可能是pdo_类型。即PDO::PARAM_BOOL,PDO::PARAM_NULL。。。我猜你没有看到我上面的评论;)这到底是什么意思?当前,例如,您正在MySQL中返回日期时间的“字符串”。另一方面,在postgresql中,字符(n)或字符变化(n)的n>255。所以,如果(出于什么原因)这些信息是至关重要的,它就不会是可靠的(?)好的观点,就像我说的,整个问题是关于试图找到一种可靠的方法来分类类型。这只是我尝试的一种方式。真遗憾。为什么人们会使用一个没有定义任何标准的标准化访问层?多谢你提到这个问题。你是说,使用列名作为自己的别名?那将是相当古老的,但我想那会管用的。
var_string
longlong
newdecimal
geometry
...
//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']];
}