Database 在CodeIgniter 3中动态更改数据库名称

Database 在CodeIgniter 3中动态更改数据库名称,database,codeigniter,configuration,Database,Codeigniter,Configuration,我需要在验证用户后更改数据库名称。在database.php文件中有一个 $db['default'] = array(.... 'database' => 'databasename1', ... ); 我知道你可以用$this->db->database来显示数据库的值。我想在用户会话期间将其更改为另一个名称 我尝试过使用$this->db->set_数据库('databasename2')和其他各种尝试,但都没有解决方案。我也找了,找不到解决办法 有人知道如何在用户

我需要在验证用户后更改数据库名称。在database.php文件中有一个

 $db['default'] = array(....
     'database' => 'databasename1',
...
  );
我知道你可以用$this->db->database来显示数据库的值。我想在用户会话期间将其更改为另一个名称

我尝试过使用$this->db->set_数据库('databasename2')和其他各种尝试,但都没有解决方案。我也找了,找不到解决办法


有人知道如何在用户会话期间更改数据库名称吗?

这是您的解决方案。使用相应的客户端ID构建所有链接,并更改database.php,如

if (isset($_REQUEST['clid'])) {
    $efg = (int) $_REQUEST['clid'];
} else {
  die('wrong URL');
}

$dbh = new PDO('mysql:host=localhost;dbname=client_db,client_dbuser,clientdb_pass');

 $sql = 'SELECT db_username,db_name,db_pass FROM clients WHERE id=?';

$sth = $dbh->prepare($sql);
 $sth->execute(array($efg));
$d_result = $sth->fetchAll(PDO::FETCH_ASSOC);
if (count($d_result) < 1) {
  die('Wrong client');
}


$active_group = 'default';
$query_builder = TRUE;

$db['default'] = array(
'dsn' => '',
'hostname' => 'localhost',
'username' => $d_result[0]['db_username'],
'password' => $d_result[0]['db_pass'],
'database' => $d_result[0]['db_name'],
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => TRUE,
'db_debug' => TRUE,
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_unicode_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
if(isset($\u请求['clid'])){
$efg=(int)$_请求['clid'];
}否则{
die(‘错误的URL’);
}
$dbh=newpdo('mysql:host=localhost;dbname=client_db,client_dbuser,clientdb_pass');
$sql='从id=?'的客户端选择db_用户名、db_名称、db_密码';
$sth=$dbh->prepare($sql);
$sth->execute(数组($efg));
$d_result=$sth->fetchAll(PDO::FETCH_ASSOC);
如果(计数($d_结果)<1){
死亡(“错误的客户”);
}
$active_group='default';
$query\u builder=TRUE;
$db['default']=数组(
“dsn'=>”,
'主机名'=>'本地主机',
'username'=>$d_结果[0]['db_username'],
'password'=>$d_result[0]['db_pass'],
'数据库'=>$d_结果[0]['db_名称'],
'dbdriver'=>'mysqli',
“dbprefix'=>”,
“pconnect”=>正确,
“db_debug”=>TRUE,
'cache_on'=>FALSE,
“cachedir'=>”,
“字符集”=>“utf8”,
“dbcollat”=>“utf8\u unicode\u ci”,
“交换前”=>”,
“加密”=>FALSE,
“压缩”=>FALSE,
“stricton”=>错误,
“故障转移”=>array(),
“保存查询”=>TRUE
);

我确实从客户端数据库中收集了
$d_结果[0]['db_用户名'],$d_结果[0]['db_通行证]
等。你可以从课时或其他什么地方拿。希望有帮助。

这样您就可以从会话中获取连接详细信息,并使用这些详细信息手动连接到数据库,完成后将其关闭

手动连接到数据库

$this->load->database();
此函数的第一个参数可以选择性地用于从配置文件中指定特定的数据库组,或者您甚至可以提交配置文件中未指定的数据库的连接值。示例:

要从配置文件中选择特定组,可以执行以下操作:

$this->load->database('group_name');
其中group_name是配置文件中连接组的名称

要手动连接到所需的数据库,可以传递一组值:

$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;
$config['cache_on'] = FALSE;
$config['cachedir'] = "";
$config['char_set'] = "utf8";
$config['dbcollat'] = "utf8_general_ci";

$this->load->database($config);
有关每个值的信息,请参阅配置页面

也可以将数据库值作为数据源名称提交。DSN必须具有以下原型:

$dsn = 'dbdriver://username:password@hostname/database';

$this->load->database($dsn);
要在连接DSN字符串时覆盖默认配置值,请将配置变量添加为查询字符串

$dsn = 'dbdriver://username:password@hostname/database?char_set=utf8&dbcollat=utf8_general_ci&cache_on=true&cachedir=/path/to/cache';

$this->load->database($dsn);
手动关闭连接

当CodeIgniter智能地关闭数据库连接时,您可以显式地关闭连接

$this->db->close();

有关连接到多个数据库的更多信息,请阅读此

我以这种方式解决了这个问题,除非有人看到安全问题,否则我认为这种方式是干净的

将会话设置为自动加载

在database.php中

 $ci = get_instance();
 if (!isset($ci->session->userdata['clientdb'])){
      $ci->session->set_userdata('clientdb','database1');
 }

 $active_group = 'default';
 $query_builder = TRUE;

 $db['default'] = array(
      ........
      'database' => $ci->session->userdata['clientdb'],
      ..........
 );

数据库值是通过用户会话的cleintdb值设置的。

为什么需要这样做?每个公司都有自己的数据库,用户登录时会提供数据库名称。那么我想最好将数据库名称放在会话中,然后从会话中调用或重命名它,如果你可以像在这篇文章中那样使用多个数据库的话,那就更有意义了。这就是我试图弄明白的方法,就是在读取数据库时,将会话中的数据库名转换成database.php文件中的数据库名。尝试访问$this时发生错误,该错误表示“不在对象上下文中”时无法访问。这将不起作用,因为库未初始化yetNot工作消息:mysql_connect():mysql扩展已弃用,将来将被删除:使用mysqli或PDO文件名:mysql/mysql_driver.php行号:136 Backtrace:File:/var/www/REPO/cgen/application/controllers/cgen.php行:28函数:数据库文件:/var/www/REPO/cgen/index.php行:315函数:require_once