CodeIgniter 3 - динамически загружать клиентскую базу данных - PullRequest
1 голос
/ 04 марта 2020

У меня есть основная база данных, давайте назовем ее admin_db. Эта база данных хранит всю информацию о моих существующих клиентах и ​​базу данных, чтобы использовать их при входе в мою систему. Моя страница входа в систему имеет 3 поля: -

  • Company ID
  • Username
  • Password

Таким образом, предполагается Поток состоит в том, что когда пользователь вводит все 3 поля, основная база данных будет запрашиваться для значения Company ID, которое затем возвращает имя базы данных пользователя, например. client_x_db и затем аутентифицируйте Username и Password в этой клиентской базе данных. Если пользователь проходит аутентификацию, с этого момента будет использоваться клиентская база данных client_x_db.

Я знаю, что могу загрузить основную базу данных администратора, admin_db в качестве базы данных по умолчанию в config / database. php но как я могу динамически загружать клиентскую базу данных для ПЕРВОЙ аутентификации учетных данных пользователя перед его постоянным использованием после аутентификации пользователя. Обратите внимание, что до тех пор, пока пользователь не будет AUTHENTICATED, основная база данных admin_db все еще используется.

Надеюсь, я четко изложил свое описание потока и с нетерпением жду каких-либо советов от экспертов здесь. Спасибо.

Ниже приведены мои текущие настройки.

В config / database. php.

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

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    'username' => 'admin_user',
    'password' => 'admin_password',
    'database' => 'admin_db',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8mb4',
    'dbcollat' => 'utf8mb4_unicode_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

$db['client-x'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    'username' => 'client_user',
    'password' => 'client_password',
    'database' => 'client_x_db',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8mb4',
    'dbcollat' => 'utf8mb4_unicode_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

В моем классе аутентификации я запрашиваю основную базу данных, получаю информацию о клиентской базе данных и загрузите ее следующим образом.

$clientDb = $this->admin_model->get_client_database_info($company_id);
// Note: $clientDb has value of client-x

$db1 = $this->load->database($clientDb, TRUE);
// Similar to $db1 = $this->load->database('client-x', TRUE); 

$is_authenticated = $db1->query(AUTHENTHICATE USER CREDENTIAL);

// If authenticated, then use $db1 from this point onwards.

// If failed authentication, then drop $db1 database connection and return error message.

Поэтому мой вопрос заключается в том, существует ли более простой и элегантный способ без необходимости предварительно заполнять все соединения с базой данных моего клиента в config / database. php но динамически загружать клиентскую базу данных на основе того, что хранится в основной базе данных admin_db.

...