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

  • 相关阅读:
    [JSOI2007][BZOJ1031] 字符加密Cipher|后缀数组
    leetcode Flatten Binary Tree to Linked List
    leetcode Pascal's Triangle
    leetcode Triangle
    leetcode Valid Palindrome
    leetcode Word Ladder
    leetcode Longest Consecutive Sequence
    leetcode Sum Root to Leaf Numbers
    leetcode Clone Graph
    leetcode Evaluate Reverse Polish Notation
  • 原文地址:https://www.cnblogs.com/koboshi/p/4052081.html
Copyright © 2011-2022 走看看