在CodeIgniter 3

时间:2015-06-17 18:23:43

标签: database codeigniter configuration

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

 $db['default'] = array(....
     'database' => 'databasename1',
...
  );

我知道您可以使用$ this-> db->数据库显示数据库的值。我希望在用户会话期间将其更改为其他名称。

我尝试过使用$ this-> db-> set_database('databasename2')以及其他没有解决方案的尝试。我也搜索过,找不到解决办法。

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

3 个答案:

答案 0 :(得分:3)

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

手动连接到数据库

$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();

有关连接到多个数据库的更多信息,请阅读此https://ellislab.com/codeigniter/user-guide/database/connecting.html

答案 1 :(得分:0)

这是你的解决方案。使用相应的客户端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
);

我从客户端数据库收集$d_result[0]['db_username'], $d_result[0]['db_pass']等。你可以从会话或其他任何东西。希望它有所帮助。

答案 2 :(得分:0)

我解决了这个问题,除非有人发现安全问题,否则这对我来说似乎很干净。

在自动加载中设置会话。

在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值设置的。