本文实例讲述了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