2015-06-17 75 views
2

我需要在用戶驗證後更改數據庫名稱。在database.php文件中有這個。在CodeIgniter中動態更改數據庫名稱3

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

我知道你可以用$ this-> db-> database顯示數據庫的值。我想在用戶會話期間將其更改爲另一個名稱。

我已經嘗試使用$ this-> db-> set_database('databasename2')和其他各種嘗試沒有解決方案。我也搜索了並找不到解決方案。

任何人都知道如何在用戶會話期間更改數據庫名稱?

+0

你爲什麼需要這樣做? – Nassim

+0

每個公司都有自己的數據庫,並且用戶登錄提供數據庫名稱。 – dutchlab

+0

然後我想最好是將數據庫名稱放在會話中,然後調用它或從會話中重命名它,這樣做更有意義 – Nassim

回答

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值設置。

+1

這是行不通的,因爲圖書館還沒有初始化 – nurulhudamustaqim

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

,讓你可以從會話連接的詳細信息並連接到數據庫中使用這些細節手動和關閉它做

當手動連接到數據庫

$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:[email protected]/database'; 

$this->load->database($dsn); 

要使用DSN字符串連接時覆蓋默認配置值,添加配置變量作爲查詢字符串。

$dsn = 'dbdriver://username:[email protected]/database?char_set=utf8&dbcollat=utf8_general_ci&cache_on=true&cachedir=/path/to/cache'; 

$this->load->database($dsn); 

手動關閉連接

雖然笨智能需要關閉數據庫連接的照顧,你可以明確地關閉連接。

$this->db->close(); 

更多有關連接到多個數據庫讀取此https://ellislab.com/codeigniter/user-guide/database/connecting.html

+0

不工作 消息:mysql_connect()函數:MySQL擴展已被棄用,將在將來被移除:使用庫MySQLi或PDO代替 文件名:MySQL的/ mysql_driver.php 行號:136 回溯: 文件:/var/www/REPO/cgen/application/controllers/Cgen.php 線:28 功能:數據庫 文件:/var/www/REPO/cgen/index.php 線:315 功能:require_once –

相關問題