搜索墙首页  编程技术  java  asp  ajax  php  c/c#/c++  数据库  oracle  mysql  db2  操作系统  windows  linux  股吧
首页 > 编程 > PHP
 1         
1楼  hshqcn 2010-04-01

    PDO的Mysql驱动返回的结果中,所有的字段都是字符串,
使用statement->getColumnMeta得到的列元信息,其中的pdo_type也表明是字符串。

    php可以自动处理类型转换,比如整型和字符串,但是对于其他环境,比如传给其他平台(如flash),就要在其中一端进行类型转换,或者在协议中处理。另外,要基于查询结果的元信息构建自动化的数据处理,比如ORM,也就不方便了。

    原因是,mysql驱动使用mysql_fetch_row函数取得结果集,它是个字符串数组,即所有列都是字符串方式的存储,并且没根据DB存储的类型进行转换,相应地,列的元数据也就都是字符串类型了;

    另外,pdo本身的数据类型也有限,跟DB、DB客户端库函数的数据类型有差异,比如pdo没有浮点数类型。

    根据pdo接口规范,只要修改mysql驱动中的两个回调函数就可以了:
pdo_stmt_describe_col_func pdo_mysql_stmt_describe

pdo_stmt_get_col_data_func pdo_mysql_stmt_get_col
(前面是pdo中的函数类型,后面是mysql驱动中的对应实现函数)。

    前者是描述结果集的列的元数据,原来对类型信息统一描述为字符串,
改为根据mysql的存储类型使用对应的pdo类型描述即可;

    后者是从结果集中取列数据,因为结果集的存储是mysql客户端库管理的,
可根据pdo_stmt_get_col_data_func的规范使用新分配的存储,来持有类型转换后的数据,并通知pdo用后释放改存储空间;
这两个要同时修改,因为pdo从pdo驱动中取数据时候要根据类型信息进行处理。

    对于php v5.3.2中的pdo_mysql,修改pdo_mysql_stmt_describe函数,
替换
“cols[i].param_type = PDO_PARAM_STR;”(PDO_PARAM_STR是pdo类型,见其头文件)
为相应的代码,它们依据S->fields[i].type(mysql的类型,见其头文件)得到相应的pdo类型;

    修改pdo_mysql_stmt_get_col函数,
替换
“*ptr = S->current_data[colno];
*len = S->current_lengths[colno];”
为相应的代码,它们依据S->fields[colno].type得到相应的pdo类型,
对于pdo的字符串类型,直接使用上面两行,
其他需要转换的类型则依据目标类型所需存储空间使用emalloc分配空间,
并转换数据类型存入其中,修改参数指针ptr指向该空间,
修改参数指针len持有该空间尺寸,
修改参数指针caller_frees为非空值以通知pdo管理它;
(处理方式参见pdo规范 2.6.6节 介绍 SKEL_stmt_get_col_data_func 的部分,
各类型参数所需空间参见pdo实现中的fetch_value方法,它通过get_col取得数据然后依据类型做相应的处理。)

    我按照以上方式加入了整型数的支持,在query、prepare&execute后的各种fetch以及statement的遍历方式的测试中均能正确得到数据和类型;
pdo的mysql驱动中还有对mysqlnd的处理,现在还没研究,

    如果适当修改pdo,应该也能支持float类型吧。

 1         
您的发言将按有关规定都会存档,您须为所发表后果负责,请您遵纪守法并注意语言文明。
标题:PDO Mysql驱动返回结果的列类型问题
热门关注
标题回复点击
三 php与XML、XSLT、Mysql的结合运用,下载篇0455
php 学习的连接整理0384
无法加载 mcrypt 扩展,请检查您的 PHP 配置。7290
源码安装PHP5.3.00272
php 日记(资料来源:internet )1266
eclipse 插件net.sf.simpletest.eclipse 无法装入类1264
为Fedora Linux 上PHP添加OCI 支持0260
php & apache & mysql安装配置软件与文档0252
云动力发布Magento最新版本简体中文语言包0249
Warning: mysql_num_rows(): supplied argument3240
搜索墙@2009 www.pkwall.com all rights reserved QQ:276471788 [京ICP备09111534号]
声明:本站部分数据来源于网络,仅供参考,如有版权问题,请联系我们,我们将及时删除!转载本站请注明来源