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

c90cadccf06ff6fb04b20ae3486314e8.png

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

版本说明:

thinkphp3.2.3

新增自定义行为类

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

文件内容:

namespace CommonBehaviors;

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日志

图中代码验证数据库存在不存在的C("PRIVATEIDS")在文件Application/Common/Conf/dbname.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中使用扩展配置选项配置加载;

"LOAD_EXT_CONFIG" => "constants,systemConfig,dbname",//加载常量配置

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

内容如下:

/*

* 扩展行为类配置文件

* @author:liangxifeng

* @date:2016-08-13

*/

return array(

//应用开始标签位添加切换数据库行为

"action_begin"=>array("Common\Behaviors\SwitchDbBehavior"),

);

行为类介绍请点击

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

使用方法

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

public function index()

{

//注册session切换数据库

session("privateId",2);

//手动切换数据库为私有库

tag("action_begin",$params="share");

$wechat = D("Wechat");

//查询数据库

$res = $wechat->where("wechat_id=1")->find();

echo "

";

var_dump($res);

exit;

}

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值