在很多开发工作中,会有这样的项目需求,后台根据不同的角色登录来选择不同的数据。这是一种权限管理的思想,其实他们还是共用一个数据库,只是根据不同的的登录账号来筛选不同的数据而已。然而,今天我要讲的是根据不同的登录账号来切换整个数据库,这个项目需求一般是偏向后台,前台一般没有数据,因为数据库会变如果涉及前台数据的话,那么前台数据就会一下一个样,乱套了,用户体验非常不好。不瞒大家,今天我这个项目是只要后台的门禁管理系统,现在根据不同地区的客户选择他们自己的数据库,这样设计的话,方便以后数据的维护和管理。下面来看核心的代码吧。其实,切换数据库的操作放在模型里面就行了,但是为了全后台都能切换过来,所有在公共模型里面切换效果最明显了,这就涉及到要修改ThinkPHP的核心代码了。找到你项目的地址:ThinkPHP\Library\Think\Model.class.php,并在构造方法里面修改成如下代码:

public function __construct($name='',$tablePrefix='',$connection='') {

// 模型初始化

$this->_initialize();

// 获取模型名称

if(!empty($name)) {

if(strpos($name,'.')) { // 支持 数据库名.模型名的 定义

list($this->dbName,$this->name) = explode('.',$name);

}else{

$this->name   =  $name;

}

}elseif(empty($this->name)){

$this->name =   $this->getModelName();

}

// 设置表前缀

if(is_null($tablePrefix)) {// 前缀为Null表示没有前缀

$this->tablePrefix = '';

}elseif('' != $tablePrefix) {

$this->tablePrefix = $tablePrefix;

}elseif(!isset($this->tablePrefix)){

$this->tablePrefix = C('DB_PREFIX');

}

// 数据库初始化操作

// 获取数据库操作对象

// 当前模型有独立的数据库连接信息

/**100txycom**/

switch ($_SESSION['username']) {

case 'admin':

$this->db(0,empty($this->connection)?$connection:$this->connection,true);

break;

case 'czw001':

$this->db(0,empty($this->connection)?$connection:$this->connection,true);

break;

case 'guanli':

$this->db(1,"mysql://100txy:100txycom@123.45.67.890:3306/testdb",true);

break;

default:

$this->db(0,empty($this->connection)?$connection:$this->connection,true);

break;

}

/**100txycomend**/

}

上面的代码实现的效果就是,如果是admin、czw001时,登录时使用的数据库就是config.php默认的数据库,如果是guanli那么使用的就是testdb数据库。

1503886805901779.jpg

admin登录-默认数据库

1503886841631859.jpg

guanli登录-testdb数据库

值得注意的数,为保持项目的一致性两个数据库的结构应该一致,而且登录账号表要数据和结构一致。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐