Intereting Posts
mySql – создание соединения с использованием списка значений, разделенных запятыми Как фильтровать ассоциативный массив по значениям и разбивать на две переменные? Как получить новую ширину и высоту после поворота изображения с помощью функции imagerotate ()? Чтение дочерних узлов с помощью XMLReader Легкая IDE для Linux Как преобразовать массив имен в массив чисел Я хочу, чтобы мой поиск показывал только результаты с соответствующими значениями полей. Как это делается? PHP – Измененное изображение имеет больший размер файла Получить идентификаторы заказа со статусом = «Завершить» в Magento Функция вызова в массиве (PHP) Как Doctrine2 задает значения Id Как установить права на чтение и запись в Apache на компьютере под управлением Windows Увеличение ограничения вызовов функций вложенности Получить источник изображения из элемента html dom Могу ли я сделать более одного запроса на связку?

PHP Yii: подключение к базе данных во время выполнения

Я хотел бы подключиться ко второй базе данных с Yii во время выполнения. Имя базы данных будет выводиться из таблицы базы данных после входа пользователя в систему.

Я видел в учебнике, что должен сделать это:

$db2 = Yii::createComponent(array( 'class' => 'EMongoClient', 'server' => 'mongodb://127.0.0.1:27017', 'db' => $emp['database'] )); Yii::app()->setComponent('db2',$db2); 

Но в моем контролере, когда я получаю доступ к Yii::app()->db2 получаем ошибку:

Свойство «CWebApplication.db2» не определено

Что я делаю не так?

Для меня работает следующее:

 Yii::app()->mongodb->setActive(false); Yii::app()->mongodb->setServer('mongodb://localhost:27017'); Yii::app()->mongodb->setDb('db1'); Yii::app()->mongodb->setActive(true); 

ОБНОВЛЕНО: попробуйте вместо этого экземпляр передать конфигурации:

 Yii::app()->setComponent( 'db2', array( 'class' => 'EMongoClient', 'server' => 'mongodb://127.0.0.1:27017', 'db' => $emp['database'] ) ); 

Или вы можете создать специальный индекс для params в конфигурациях, например:

  ... 'params' => array( 'db2' => null, ), 

И использование Yii::app()->params['db2'] = $db2

Из этого комментария:

Моя проблема заключается не в создании компонента. Вскоре после создания, если я получаю доступ к Yii :: app () -> db2, он работает, но когда я пытаюсь получить доступ через другую модель или контроллер, я получаю ошибку

Я думаю, что вы устанавливаете этот компонент только один раз где-то, а затем отправляете последующие запросы на разные контроллеры.

Вам нужно поместить код, где-то он называется EVERYTIME, в каждом запросе. Вот как работает PHP, нет «глобального состояния приложения»,

по умолчанию Yii поставляется с protected/components/controller.php имеет базовый контроллер для остальной части приложения.

мое предложение было бы поместить ваш код в метод init() этого контроллера, чтобы он всегда вызывался.

Вы упомянули, что имя базы данных поступает из таблицы после входа пользователя в систему, поэтому вам нужно сохранить это значение в сеансе, в другом – иметь доступ к нему в других запросах:

 <?php // After login in Yii::app()->user->setState('db_name', $db_name); // in protected/components/controller.php public function init() { if (!Yii::app()->user->isGuest) { $db2 = Yii::createComponent(array( 'class' => 'EMongoClient', 'server' => 'mongodb://127.0.0.1:27017', 'db' => Yii::app()->user->getState('db_name') )); Yii::app()->setComponent('db2',$db2); } } 

Надеюсь, что это помогает, я здесь много чего делаю 🙂