首页 > 代码库 > ThinkPHP3.1在多数据库连接下存储过程调用bug修正
ThinkPHP3.1在多数据库连接下存储过程调用bug修正
最近使用ThinkPHP3.1进行一个项目的开发,由于该项目需要连接多台不同的数据库,所以使用如下配置方法:
1 <?php 2 return array( 3 //‘配置项‘=>‘配置值‘ 4 //数据库配置 5 ‘DB_PREFIX‘ => ‘‘, 6 ‘DB_BLACK_FP‘ => array( 7 ‘db_type‘ => ‘mysql‘, 8 ‘db_user‘ => ‘xxx‘, 9 ‘db_pwd‘ => ‘xxx‘,10 ‘db_host‘ => ‘xxx‘,11 ‘db_port‘ => 3306,12 ‘db_charset‘ => ‘utf8‘,13 ),14 ‘DB_BLACK_SAMPLE‘ => array(15 ‘db_type‘ => ‘mysql‘,16 ‘db_user‘ => ‘xxx‘,17 ‘db_pwd‘ => ‘xxx‘,18 ‘db_host‘ => ‘xxx‘,19 ‘db_port‘ => 3306,20 ‘db_charset‘ => ‘utf8‘,21 ),22 //其他配置......23 );
实际开发时发现,只要调用存储过程(call xxxxx(yy);),将会导致数据库连接被关闭,后续数据库请求失败。
经查阅发现,使用PHP的mysql扩展函数调用存储过程,的确会导致后续数据库请求失败,解决方法是先调用存储过程后,手动调用一次mysql_close再重新发起连接。
再调试ThinkPHP3.1代码,发现默认单数据库配置时,执行call语句后(即调用存储过程),代码逻辑会自动重新发起数据库连接,但多数据库连接时则不会。
修正方法如下:
1.改为使用mysqli而不是mysql
//其他配置......‘db_type‘ => ‘mysqli‘,//其他配置......
2.修改框架代码:
打开框架代码ThinkPHP3.1/Lib/Driver/Db/DbMysqli.class.php第90行左右
//其他代码......//从$res->free_result();//修改为if (is_object($res)) { $res->free_result();}//其他代码......
3.请求框架缓存:
清除Runtime文件夹内容
按以上修改后运行,调用存储过程后不再导致后续sql执行失败,一切正常。
总结:
其实PHP的mysql扩展是支持存储过程调用的,但只支持无返回结果输出的存储过程,如果调用有返回结果输出的存储过程,在下一次查询语句执行时,会因为上一次的存储过程输出结果没有被读取也没有释放,而导致报错,所以引起后续查询语句执行失败。
解决方法是要么改用PDO或mysqli扩展,或者每次调用存储过程后重新发起数据库连接。
ThinkPHP3.1在多数据库连接下存储过程调用bug修正
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。