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

admin登录-默认数据库

guanli登录-testdb数据库
值得注意的数,为保持项目的一致性两个数据库的结构应该一致,而且登录账号表要数据和结构一致。
很赞哦! ()
