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

吾爱主题 阅读:125 2021-09-28 11:18:00 评论:0

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

版本说明:

thinkphp3.2.3

新增自定义行为类

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

文件内容:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 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中. 内容如下:

?
1 2 3 4 5 6 7 8 /*数据库配置*/ 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日志

图中代码验证数据库存在不存在的C('PRIVATEIDS')在文件Application/Common/Conf/dbname.php中配置内容如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 <?php /* * 本配置文件主要存储数据库后缀名, * 前缀为wechat_, * 在Application/Common/Behaviors/TestBehavior.class.php中验证 * 注意:在新增数据库的时候,注意修改该文件 * * @author: liangxifeng * @date: 2016-08-13 */ return array (     'PRIVATEIDS' => array ( 'share' ,1,2,3,4) );

constant.php和dbname.php则是在配置文件Application/Common/Conf/config.php中使用扩展配置选项配置加载;

?
1 'LOAD_EXT_CONFIG' => 'constants,systemConfig,dbname' , //加载常量配置

在使用自定义行为类的时候要在Application/Common/Conf/中新增tags.php

内容如下:

?
1 2 3 4 5 6 7 8 9 /* * 扩展行为类配置文件 * @author:liangxifeng * @date:2016-08-13 */ return array (     //应用开始标签位添加切换数据库行为     'action_begin' => array ( 'Common\\Behaviors\\SwitchDbBehavior' ), );

行为类介绍请点击

扩展行为类详细了解请点击

使用方法

在注册session后或手动加载使用,比如在控制器中:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 public function index() {    //注册session切换数据库    session( 'privateId' ,2);    //手动切换数据库为私有库    tag( 'action_begin' , $params = 'share' );    $wechat = D( 'Wechat' );    //查询数据库    $res = $wechat ->where( 'wechat_id=1' )->find();    echo "<pre>" ;    var_dump( $res );    exit ; }

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

原文链接:https://blog.csdn.net/luyaran/article/details/70332736

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容