Привет. Есть ли в системе готовый метод(ы) для подключения другой бд? Например в каком то экшене нужно подключиться и потом работать с другой бд, той же структуры, что и рабочая.
Lora, судя по коду, да. Сам не пробовал, только делал выборки из таблиц с другим префиксом.
Создаете новый объект типа db github.com/instantsoft/icms2/blob/master/system/core/database.php
Примерно так
//$myoptions['db_host']...['db_user']...['db_pass']...['db_base'] $mydb = new Database($myoptions);
А потом передаете это соединение при вызове модели github.com/instantsoft/icms2/blob/5689b49002624aceb9cc4b692f1bf47f7da5ed1e/system/core/model.php#L97
Примерно так
$myModel = new Model($mydb);
Ок, спасибо, буду пробовать.
$db = cmsDatabase::getInstance(); $db->setOptions($options); $db->setDbPrefix($options['db_prefix']); $db->changeDB($options['db_base']); $db->query("SET sql_mode=''"); // Это не обязательно $model = new cmsModel($db); $model->db = $db; $model->db->reconnect(true);
Как-то так. В $options нужны только данные для подключения к базе и опции базы.
Судя по коду всё должно работать. Но вот не хочет по феншую. Если писать так
$newOptions = [...]; $mydb = new Database($myoptions); $model = new cmsModel($mydb);
То запрос в новую базу выполняется. Но в опциях базы не все данные конфига.
Если устанавливать опции через метод
$mydb = cmsDatabase::getInstance();// new Database(); $mydb->setOptions($newOptions);
То в опциях всё как и положено и новые данные для подключения. Но при попытке запроса, запрос идёт почему то в текущую базу. При попытке реконекта ($model->db->reconnect(true);) вообще всё чёрное и ошибок не разобрать. как будто подключение есть, но все остальные настройки из текущего конфига.
В $options достаточно иметь только этот массив данных, только со своими значениями. Плюс, если база находится на другом хостинге, то там надо смотреть, чтобы был активен «удаленный доступ» к базе данных.
[ 'db_host' => $this->cms_config->db_host, 'db_user' => $this->cms_config->db_user, 'db_pass' => $this->cms_config->db_pass, 'db_base' => $this->cms_config->db_base, 'db_charset' => $this->cms_config->db_charset, 'db_prefix' => $this->cms_config->db_prefix ];
И после того, как натворили делов в другой базе, не забудьте переподключится обратно к свое базе. Так ошибок будет меньше на экране.
С опциями всё нормально. Я думаю понял в чём проблема. Нужна чистая база изначально. Или синхронизированная с текущей. Так как система начинает искать данные из подключённой базы. Виджеты например. Но это уже другой вопрос.
Так как система начинает искать данные из подключённой базы. Виджеты например.
Всё верно, также хуки и прочие творения, котороые даже не знают о новом подключении к другой базе. Поэтому важно после «получения/отправки» данных в другую базу, переподключиться к своей.
Ясно.Спасибо всем. Пока не закрываю.Мало ли что)