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扩展,或者每次调用存储过程后重新发起数据库连接。

转载于:https://www.cnblogs.com/koboshi/p/4052081.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值