2015-05-28 2 views
0

Я видел this topic и пытался реализовать этот путь и к несчастью не работает.CodeIgniter динамическая база данных не работает

Мне нужно динамически подключаться к базе данных с помощью CodeIgniter. Эта база данных не может быть константой переменной в файле application/config/databases.php. Я пробовал два разных способа подключения к другой базе данных:

Первый по модели - с третьим параметром, как documentation refers.

class users extends CI_Controller 
{ 
    public function __construct() 
    { 
     parent::_construct(); 

     $config['hostname'] = 'localhost'; 
     $config['username'] = 'root'; 
     $config['password'] = ''; 
     $config['database'] = 'clockin_AlKj'; 
     $config['dbdriver'] = 'mysqli'; 
     $config['dbprefix'] = ''; 
     $config['pconnect'] = FALSE; 
     $config['db_debug'] = TRUE; 

     $this->load->model('company_model', '', $config); 
     $this->company = $this->company_model->get(); 
    } 
} 

Это бросает ошибку:

Error Number: 1146

Table 'clockin_admin.company' doesn't exist

SELECT * FROM (company)

Filename: C:\xampp\htdocs\clockin\system\database\DB_driver.php

Второй способ подключения с помощью базы данных.

class users extends CI_Controller 
{ 
    public function __construct() 
    { 
     parent::_construct(); 

     $this->load->model('company_model'); 
     $this->company = $this->company_model->get(); 
    } 
} 

class Company_model extends CI_model 
{ 
    private $otherDb; 

    public function __construct() 
    { 
     parent::__construct(); 

     $config['hostname'] = 'localhost'; 
     $config['username'] = 'root'; 
     $config['password'] = ''; 
     $config['database'] = 'clockin_AlKj'; 
     $config['dbdriver'] = 'mysqli'; 
     $config['dbprefix'] = ''; 
     $config['pconnect'] = FALSE; 
     $config['db_debug'] = TRUE; 

     $this->otherDb = $this->load->database($config); 
    } 

    public function get() 
    { 
     $this->otherDb->get('company')->row(); 
    } 
} 

Это бросает ошибку:

Fatal error: Call to a member function get() on a non-object in C:\xampp\htdocs\clockin\application\models\company_model.php on line 45

который относится к линии $this->otherDb->get('company')->row();

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

if($this->load->database($config) === FALSE) 
    echo 'Yes, I could not connect..'; 

Наконец, моя конфигурация файла database.php заключается в следующем:

$active_group = 'default'; 
$active_record = TRUE; 

$db['default']['hostname'] = 'localhost'; 
$db['default']['username'] = 'root'; 
$db['default']['password'] = ''; 
$db['default']['database'] = 'clockin_admin'; 
$db['default']['dbdriver'] = 'mysqli'; 
$db['default']['dbprefix'] = ''; 
$db['default']['pconnect'] = TRUE; 
$db['default']['db_debug'] = TRUE; 
$db['default']['cache_on'] = FALSE; 
$db['default']['cachedir'] = ''; 
$db['default']['char_set'] = 'utf8'; 
$db['default']['dbcollat'] = 'utf8_general_ci'; 
$db['default']['swap_pre'] = ''; 
$db['default']['autoinit'] = TRUE; 
$db['default']['stricton'] = FALSE; 

ответ

1

Извините, что я дал вам неправильный ответ сначала. я просто обозреваю код CodeIgniter, и это может сработать. Вот альтернативное решение:

Вы можете создать БД на лету, используя «строка соединения» в качестве первого параметра и значение TRUE в качестве второго параметра таким образом, вместо того, чтобы заменить $this->db вар он просто возвращает объект DB к $this->otherDb:

$this->otherDb = $this->load->database('mysql://username:[email protected]:9090/database',TRUE); 

он должен работать как intented

Дополнительно, если вы хотите установить dbprefix, pconnect или db_debug, вы можете сделать это, определив часть запроса в «строке подключения»:

$this->otherDb = $this->load->database('mysql://username:[email protected]:9090/database?dbprefix=pre_&pconnect=FALSE&db_debug=TRUE',TRUE); 

источник: https://ellislab.com/codeigniter/user-guide/database/connecting.html

+0

Он все еще не работает.Он продолжает фокусировать базу данных, установленную в файле 'database.php'. '$ this-> otherDb = $ this-> load-> database ('mysql: // root: @localhost: 9090/clockin_AlKj', TRUE);' – Linesofcode

+0

Вы уверены? Я только что протестировал, и этот метод работает. возможно, ваша строка пароля содержит некоторые символы, которые могут смутить парсер? Кроме того, сервер действительно работает на порту 9090? если это порт по умолчанию, вам не нужно указывать его. – emiliopedrollo

+0

Вы вернули метод get в $ this-> otherDb-> get ('company') -> row(); ? – emiliopedrollo

1

Вы можете изменить конфигурации после загрузки базы данных:

class Company_model extends CI_model 
{ 
    private $otherDb; 

    public function __construct() 
    { 
    parent::__construct(); 

    $this->load->database(); 

    $this->db->hostname = 'localhsot'; 
    $this->db->username = 'root'; 
    $this->db->password = ''; 
    $this->db->database = 'clockin_AlKj'; 
    $this->db->dbprefix = ''; 
    $this->db->pconnect = FALSE; 
    $this->db->db_debug = TRUE; 
    } 

    public function get() 
    { 
    $this->db->get('company')->row(); 
    } 
} 

Вы просто не можете изменить водитель так.

+0

Я просто сделал изменения, и она продолжает указывать на 'clockin_admin' базы данных вместо' clockin_AlKj'. Приведенная ошибка является такой же, как и первая ошибка. – Linesofcode

+0

перемещение строки $ this-> load-> database() под другими операциями должно быть выполнено. –

1

Пожалуйста Попробуйте его работы для продолжавшегося версии MySQLi

$this->otherDb = $this->load->database('mysqli://username:[email protected]:3306/database',TRUE); 
Смежные вопросы