ThinkPHP3.1在多数据库连接下存储过程调用bug修正
最近使用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扩展,或者每次调用存储过程后重新发起数据库连接。
ThinkPHP3.1在多数据库连接下存储过程调用bug修正的更多相关文章
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- Oracle数据库连接、存储过程及调用
Oracle数据库连接.存储过程及调用 1. 定义一个存储过程 create or replace procedure getuser(eid in number, na out varchar, e ...
- J2EE之oracle、mysql存储过程调用
最近几天在研究hibernate.JPA对存储过程的调用,主要是针对有返回结果集的存储过程的调用方法,个人感觉存储过程是个好东西,虽然说heibernate对数据访问封装的比较不错,再加上他的缓存机制 ...
- c#中两种不同的存储过程调用与比较
存储过程简介 简单的说,存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用.它的参数可以被传递和返回.与应用程序中的函 ...
- SQL 存储过程调用存储过程
研究一个别人做的项目代码看到数据库里有一段存储过程调用存储过程的代码,原来的代码比较复杂. 于是自己打算写一个简单的例子学习一下. 一.首先创建了被需要被调用的存储过程. USE [MSPetShop ...
- [转]SQLSERVER存储过程调用不同数据库的数据_存储过程中通过链接服务器访问远程服务器
本文转自:http://blog.csdn.net/nnaabbcc/article/details/7967761 存储过程调用不同数据库的数据 在存储过程调用不同数据库的数据该如何做,比如在存储过 ...
- Oracle 存储过程调用返回游标的另一个存储过程。
一个扩展存储过程调用另一个存储过程,示例: 被调用存储过程:最后会返回一个游标,游标返回一个值.调用这个存储过程的存储过程同样需要获取它. procedure SearchBill --根据到货单号查 ...
- ORACLE存储过程调用Web Service
1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...
- .NET易忘备留 ORACLE存储过程调用
1.Oracle存储过程调用[返回信息,单体或者列表] public IResult FundBuild(string partnerId,string userId, DateTime beginD ...
随机推荐
- FCKeditor2.6.4控件及其使用范例
原文发布时间为:2009-06-14 -- 来源于本人的百度文章 [由搬家工具导入] 已经精简了,很小,不多说了,我的源代码去下载看。 web.config 看看。。。还有bin里面的dll就是控件, ...
- duilib入门简明教程 -- 完整的自绘标题栏(8) (转)
原文转自:http://www.cnblogs.com/Alberl/p/3343763.html 看了前面那么多教程,相信对duilib已有基本映像了,我们就快马加鞭,做出一个完整的自绘标题 ...
- win10下怎么配置以KDiff3作为merge tool和diff tool
系统环境: OS: Windows 10 Git 2.6.1.windows.1 KDiff3 0.9.98 (64 bit) 具体代码如下: git config --global --add me ...
- 在vscode中使用pylint-django插件解决pylint的一些不必要的错误提示【转】
转自:http://www.cnblogs.com/chaojihexiang/p/6417835.html 微软的vscode编辑器是一个好东西,通过vscode编辑python程序非常的方便.推荐 ...
- linux 下 多进程与多线程
[Linux]多进程与多线程之间的区别 http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请 ...
- Selenium2+python自动化(unittest)
# coding:utf-8from selenium import webdriverimport unittestimport timeclass Bolg(unittest.TestCase): ...
- Android Studio查看其它APP的布局结构
概述 日常使用别家的APP过程中,会遇到一些比较好看的布局,这时候我们就想学习一下别人的布局结构,以便参考. (1)手机连接电脑.设置手机为USB调试模式 (2)运行Android Studio,打开 ...
- C++ primer分章节快速回顾
第三章: 1,sozeof(int): int n_int=INT_MAX; sizeof n_int;(对变量括号可选) 2,#include<climits>包含一些类型的最大值3,c ...
- java获取整数的各位数值
第一种是取模运算 int qian =input/1000; //千位除以1000 int bai = input/100%10;//百位除以100%10 int shi = input%100/10 ...
- Machine Learning Done Wrong【转】
1. Take default loss function for granted Many practitioners train and pick the best model using the ...