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

雷小天博客

admin登录-默认数据库

雷小天博客

guanli登录-testdb数据库

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