PHP原生类型的列表';用于PDO getColumnMeta()的s
我正在使用PDO数据库抽象库来确保我的代码是可移植的。然而,我现在发现我需要列信息,所以我转向了这个方法,希望它能有些标准化——但从我发现的情况来看,它实际上似乎是开放的 例如,从SQLite调用该方法时,您似乎得到了一组可能的值: 来自MySQL数据库的调用会列出各种其他奇怪的值:PHP原生类型的列表';用于PDO getColumnMeta()的s,php,database,pdo,Php,Database,Pdo,我正在使用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']];
}