一个数据库切换问题

#1 zhijiangch

有多个数据库,比如:master,s10001,s10002,s10003....... //默认数据库配置
"db" => array(
                'host' => 'localhost',
                'login' => 'root',
                'password' => '123456',
                'database' => 'master',
)

如果切换到s10001,按正常切换:
$config => array(
                'host' => 'localhost',
                'login' => 'root',
                'password' => '123456',
                'database' => 's10001',
)

$new_db = spClass('db_mysql',$config,SP_PATH.'/Drivers/mysql.php',TRUE);

但每次都这样切换有点麻烦,我在spController.php写了一个函数


public function connDB($new_db = ''){          
          $config = array(
                   'host' => $GLOBALS['G_SP']['db']['host'],
                           'login' => $GLOBALS['G_SP']['db']['login'],
                           'password' => $GLOBALS['G_SP']['db']['password'],
                           'database' => $new_db,
           );                  
          return spClass('db_mysql',$config,SP_PATH.'/Drivers/mysql.php',TRUE);
}



执行结果:
方法 connDB未定义!
研究了老半天,也没解决

2015-10-23 20:44:37

#2 zhijiangch

$conn = $this->connDB("s10001");   
$db = spDB("table");
$db->db = $conn;          
$this->dump($db->findAll());

2015-10-23 20:52:01

#3 zhijiangch

直接连接也不行,这两个数据库都存在:
$config = array(
                  'host' => 'localhost',
                 'login' => 'root',
                 'password' => '123456',
                 'database' => 's10001', //换成master也不行
);       
$conn = spClass('db_mysql',$config,SP_PATH.'/Drivers/mysql.php',TRUE);

报错信息:
无法找到数据库,请确认数据库名称正确!

2015-10-23 21:02:37

#4 zhijiangch

正常连接连上了,那个函数还是不行
错误:$conn = spClass('db_mysql',$config,SP_PATH.'/Drivers/mysql.php',TRUE);
正确:$conn = spClass('db_mysql',array($config),SP_PATH.'/Drivers/mysql.php',TRUE);

2015-10-23 21:37:25

#5 jake

提示:方法 connDB未定义!

那么应该是说程序找不到你这函数,跟连不连的上有什么关系???

2015-10-23 22:54:00

#6 minijedy

我是直接把配置写入一个DB.php, 然后引入这个php,
$dsn_oracle = spClass('db_oracle',require_once(APP_PATH."/***/db.php"), SP_PATH.'/Drivers/oracle.php',TRUE);我用的ORACLE数据库

2015-10-27 09:03:12

#7 zhijiangch

minijedy 发表于 2015-10-27 09:03
我是直接把配置写入一个DB.php, 然后引入这个php,
$dsn_oracle = spClass('db_oracle',require_once(APP_PA ...
规范的写法还是在model中:若是同一类型数据库(比如mysql)更简单,仅仅改变配置中$GLOBALS['G_SP']['db']['database'] 的值:


class muser extends spModel
{
  public $pk = "id";        // 主键 var(public private protect)
  public $table = "wl_user"; // 数据表的名称

  public function __construct($new_database)
  {   
     $GLOBALS['G_SP']['db']['database'] = $new_database;        
     parent::__construct();
  }  
}



若是每个用户分配一个数据库的情况,并且数据库命名有一定规则,比如:s+userid,用session这样更简单,传值都不用了,直接用这个model连接的就是对应的数据库
class muser extends spModel
{
  public $pk = "id";        // 主键 var(public private protect)
  public $table = "user"; // 数据表的名称

  public function __construct()
  {     
     if(isset($_SESSION['userid'])){
                $GLOBALS['G_SP']['db']['database'] = 's'.$_SESSION['userid'];
         }else{
            echo "用户登录信息不存在";exit;
         }     
     parent::__construct();
  }


}

2015-10-27 10:10:01

#8 jake

“每个用户分配一个数据库”,6666666666666666

2015-10-27 11:26:56

#9 冈刀飞絮

zhijiangch 发表于 2015-10-27 10:10
规范的写法还是在model中:若是同一类型数据库(比如mysql)更简单,仅仅改变配置中$GLOBALS['G_SP']['db' ...
脑洞大开,这是做一些分销业务大代理系统的做法,{:soso_e113:}

2015-10-27 16:45:59