Как динамически загрузить настройки базы данных в коде воспламенителя - PullRequest
0 голосов
/ 08 октября 2018

Мне нужно обработать уже собранный код на codeigniter.Project - это скорее бэкэнд REST API.Это два требования, первая база данных должна быть динамически загружена из определенной клиентской базы заголовка http.Таким образом, у меня может быть БД, как DB_1234, DB_1235.и мне нужно загрузить БД на основе этого.

Предыдущий разработчик использует следующий подход.

  1. Удалить конфигурацию базы данных из application / database.php
  2. Сделал вспомогательную функциюс параметром заголовка http client, чтобы получить массив конфигурации db для конкретного клиента.
  3. функция вызова помощника в моделях с вызовом $this->load->database($config, true);.

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

Кроме того, мне нужно добавить настройки на основе среды, поэтому они такжедва способа воспламенения кода.Использование различных папок в конфигурации для среды и вставка туда файлов конфигурации и, вторую, для конкретной БД, с использованием многомерного массива для определения среды.

Так что можно рекомендовать.У меня не так много разоблачения кодигнитера.

Код помощника

function getDbConfig($customer_db) {
    if ($customer_db)
         $customerDatabase = strtolower($customer_db);
    else
         $customerDatabase = 'defaultdb';

    $config['hostname'] = 'localhost';
    $config['username'] = 'root';
    $config['password'] = 'root';
    $config['database'] = 'DB_'.$customerDatabase;
    $config['dbdriver'] = 'mysqli';
    $config['dbprefix'] = '';
    //$config['port']     = 3306;
    $config['pconnect'] = FALSE;
    $config['db_debug'] = FALSE;
    $config['cache_on'] = FALSE;
    $config['cachedir'] = '';
    $config['char_set'] = 'utf8';
    $config['dbcollat'] = 'utf8_general_ci';
    return $config;
}

Код файла модели

public function __construct() {
    ob_start();
    parent::__construct();
    $this->header = apache_request_headers();
    $config = getDbConfig($this->header['clientid']);
    $this->customDb = $this->load->database($config, true);
}

Примечание: Я знаю, что код должен санировать и проверять, существует ли база данных, прежде чем напрямую пытаться установить соединение.Это необходимо исправить позже.

Примечание: Project будет обслуживать одну БД за один раз для конкретного запроса.Но этот запрос будет иметь заголовок http, который используется для определения необходимости подключения к базе данных.Поскольку в клиенте будет n номеров и n баз данных, настройки нескольких баз данных в файле database.php не будут работать.

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете использовать две базы данных, используя файл базы данных codigniter, используя следующий код в database.php

$db['default'] = array(
'dsn'   => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'firstdatabase',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => TRUE,
'cachedir' => 'application/cache',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE

);

$db['seconddatabase'] = array(
'dsn'   => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'seconddatabase',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => TRUE,
'cachedir' => 'application/cache',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE

);

Для использованиявторая база данных синтаксис следующий.

$otherdb = $this->load->database('seconddatabase', TRUE); // the TRUE paramater tells CI that you'd like to return the database object.

$query = $otherdb->select('column_one, column_two')->get('table');
...