当前位置 主页 > 网站技术 > 代码类 >

    thinkphp3.2.3框架动态切换多数据库的方法分析

    栏目:代码类 时间:2020-01-23 15:08

    本文实例讲述了thinkphp3.2.3框架动态切换多数据库的方法。分享给大家供大家参考,具体如下:

    版本说明:

    thinkphp3.2.3

    新增自定义行为类

    文件位置:Application/Common/Behaviors/SwitchDbBehavior.class.php

    文件内容:

    namespace Common\Behaviors;
    class SwitchDbBehavior
    {
     //私有库id,如何连接公有库则设置为share字符串
     private $_privateId = '';
     /*
      * 行为扩展的执行入口必须是run
      * $param 为引用传值,所以实参必须是变量
      */
     public function run(&$params)
     {
       //获取私有库id
       $this->_privateId = empty($params) && session('?privateId') ? (int)session('privateId') : trim($params);
       //echo 'curent database is '.$this->_privateId;
       //默认连接公有库
       if(empty($this->_privateId)) $this->_privateId = 'share';
       $this->_checkDb();
       //连接公有库
       if('share' == trim($this->_privateId))
       {
         $share = $this->_connectShare();
       }else
       //连接私有库
       {
         $share = $this->_connectPrivate($this->_privateId);
       }
       //循环修改数据库配置信息
       foreach($share as $dbKey=>$dbVal)
       {
         C($dbKey,$dbVal);
       }
     }
     /*
     * 判断数据库是否存在
     */
     private function _checkDb()
     {
       //C('PRIVATEIDS') 在配置文件Appliation/Common/Conf/dbname.php中定义
       if(!in_array($this->_privateId,C('PRIVATEIDS')))
       {
         exit(__CLASS__.'->'.__FUNCTION__.': dbName error!');
       }
     }
     /*
     * 返回连接私有库配置
     */
     private function _connectPrivate($privateId)
     {
       return array(
         'DB_TYPE'  => 'mysql', // 数据库类型
         'DB_HOST'  => DB_WECHAT_HOST, // 服务器地址
         'DB_NAME'  => DB_WECHAT_NAME.(int)$privateId, // 数据库名
         'DB_USER'  => DB_WECHAT_USER, // 用户名
         'DB_PWD'  => DB_WECHAT_PASS, // 密码
         'DB_PORT'  => DB_WECHAT_PORT, // 端口
         'DB_PARAMS' => array(), // 数据库连接参数
         'DB_PREFIX' => '', // 数据库表前缀
         'DB_CHARSET'=> 'utf8', // 字符集
         'DB_DEBUG' => DB_WECHAT_DEBUG, // 数据库调试模式 开启后可以记录SQL日志
       );
     }
     /*
     * 返回连接公有库配置
     */
     private function _connectShare()
     {
       return array(
         'DB_TYPE'  => 'mysql', // 数据库类型
         'DB_HOST'  => DB_WECHAT_HOST, // 服务器地址
         'DB_NAME'  => DB_WECHAT_SHARE_NAME, // 数据库名
         'DB_USER'  => DB_WECHAT_USER, // 用户名
         'DB_PWD'  => DB_WECHAT_PASS, // 密码
         'DB_PORT'  => DB_WECHAT_PORT, // 端口
         'DB_PARAMS' => array(), // 数据库连接参数
         'DB_PREFIX' => '', // 数据库表前缀
         'DB_CHARSET'=> 'utf8', // 字符集
         'DB_DEBUG' => DB_WECHAT_DEBUG, // 数据库调试模式 开启后可以记录SQL日志
       );
     }
    }
    
    

    以上文件中用到的常量在我们的配置文件Application/Common/Conf/constant.php中. 内容如下:

    /*数据库配置*/
    define('DB_WECHAT_HOST','127.0.0.1');        //主机host
    define('DB_WECHAT_USER','common');         //用户名
    define('DB_WECHAT_PASS','common');         //密码
    define('DB_WECHAT_NAME','wechat_');         //私有库前缀
    define('DB_WECHAT_SHARE_NAME','wechat_share');   //共有库名
    define('DB_WECHAT_PORT','3306');          //端口
    define('DB_WECHAT_DEBUG',TRUE);          //数据库调试模式 开启后可以记录SQL日志