2015-06-17 2 views
2

Мне нужно изменить имя базы данных после того, как пользователь будет проверен. В файле database.php есть это.Изменение имени базы данных на лету в CodeIgniter 3

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

Я знаю, что вы можете отобразить значение базы данных с помощью базы данных $ this-> db->. Я хотел бы изменить его на другое имя в течение сеанса пользователей.

Я попытался использовать $ this-> db-> set_database ('databasename2') и различные другие попытки без решения. Я также искал и не могу найти решение.

Кто-нибудь знает, как изменить имя базы данных в течение всего сеанса пользователей?

+0

Зачем вам это нужно? – Nassim

+0

Каждая компания имеет свою собственную базу данных, и пользовательский журнал содержит имя базы данных. – dutchlab

+0

, тогда я думаю, что лучше поместить имя базы данных в сеанс, а затем вызвать его или переименовать из сеанса, имеет смысл – Nassim

ответ

0

Я решил вопрос этот путь, который кажется чистым мне, если кто-то не видит проблемы безопасности.

set сеанс в автоматической нагрузке.

В 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

вот ваше решение. строить все связи с соответствующим идентификатором клиента и изменить 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); 

Для получения дополнительной информации по каждому из этих значений смотрите страницу конфигурации.

Или вы можете отправить свои значения базы данных в качестве имени источника данных. DSNs должен иметь этот прототип:

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

вручную закрытия соединения

Хотя CodeIgniter разумно заботится о закрытии соединения с БД, вы можете явно закрыть соединение.

$this->db->close(); 

больше о подключении к нескольким базам данных читать эту https://ellislab.com/codeigniter/user-guide/database/connecting.html

+0

Не работает сообщение: mysql_connect(): расширение MySQL является устаревшим и будет удален в будущем: использовать MySQLi или PDO вместо Имя файла: MySQL/mysql_driver.php Номер Line: 136 трассировку: Файл : /var/www/REPO/cgen/application/controllers/Cgen.php Line: 28 Функция: база данных Файл: /var/www/REPO/cgen/index.php Line: 315 Функция: require_once –

Смежные вопросы