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

  • 相关阅读:
    自定义cell
    微信界面
    设置字体阴影
    Xcode 7新特性Lightweight Generics 轻量级泛型与__kindof修饰符
    @synchronized 是递归锁,类似NSRecursiveLock,递归调用不会引起死锁,而NSLock是非递归锁。
    Your build settings specify a provisioning profile with the UUID, no provisioning profile was
    NSOperationQueue与GCD
    Objective-C中继承和类别的比较:category&Inherit
    iOS 事件处理机制与图像渲染过程
    [iOS]用instancetype代替id作返回类型有什么好处?(转)
  • 原文地址:https://www.cnblogs.com/koboshi/p/4052081.html
Copyright © 2011-2022 走看看