ThinkPHP3.1在多数据库连接下存储过程调用bug修正
2024-09-07 19:50:09
最近使用ThinkPHP3.1进行一个项目的开发,由于该项目需要连接多台不同的数据库,所以使用如下配置方法:
<?php
return array(
//'配置项'=>'配置值'
//数据库配置
'DB_PREFIX' => '',
'DB_BLACK_FP' => array(
'db_type' => 'mysql',
'db_user' => 'xxx',
'db_pwd' => 'xxx',
'db_host' => 'xxx',
'db_port' => 3306,
'db_charset' => 'utf8',
),
'DB_BLACK_SAMPLE' => array(
'db_type' => 'mysql',
'db_user' => 'xxx',
'db_pwd' => 'xxx',
'db_host' => 'xxx',
'db_port' => 3306,
'db_charset' => 'utf8',
),
//其他配置......
);
实际开发时发现,只要调用存储过程(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扩展,或者每次调用存储过程后重新发起数据库连接。
最新文章
- Indexed 和 Stored 的区别
- Java的二维数组的应用及杨辉三角的编写
- JVM-class文件完全解析-类索引,父类索引和索引集合
- yii 主从数据库分离-转载http://www.yiichina.com/doc/guide/2.0/db-dao
- 【DB】SQLiteHelper
- SQL Server使用规范
- [Swift]LeetCode876. 链表的中间结点 | Middle of the Linked List
- 027_git添加多账号设置
- exe所在路径
- [android] 采用断点调试的方式观察pull解析的流程
- Web API中的路由(一)——约定路由
- caffe网络结构可视化在线工具
- STM32进入HardFault_Handler处理办法
- 【Codeforces 1120A】Diana and Liana
- Excel导出文件流下载
- jQuery星级评论表单美化代码
- oracle12c ORA-28040: No matching authentication protocol
- SQL 中的 UNION 和UNION ALL 的区别
- Double H5.0
- Python3 格式化输出 %s &; %d 等
热门文章
- Android开发跳坑记录
- linux下编译安装gcc5.1
- Android与H5互调
- jemalloc原理分析
- TopCoder SRM 301 Div2 Problem 1000 CorrectingParenthesization(区间DP)
- [Machine Learning with Python] My First Data Preprocessing Pipeline with Titanic Dataset
- jzyzoj 栈——P1148:括号匹配加强版
- protobuf3 语法解析
- 2016集训测试赛(二十四)Problem B: Prz
- OpenSSL使用1(用OpenSSL生成自签名证书在IIS上搭建Https站点)(用于iOS的https访问)