Я новичок в php / OOP и задаюсь вопросом о динамическом изменении моего подключения к базе данных.
Вот что мой main.php выглядит так:
class Main расширяет CI_Controller {
function __construct() { parent::__construct(); /* Standard Libraries of codeigniter are required */ $this->load->database($connectdb); $this->load->helper('url'); $this->load->library('grocery_CRUD'); } public function index() { if ($_POST["username"] == "root") { $connectdb="default"; } if ($_POST["username"] == "user1") { $connectdb="default1"; } if ($_POST["username"] == "user2") { $connectdb="default2"; } $connect = @mysql_connect("localhost", $_POST["username"], $_POST["password"]);//won't display the warning if any. if (!$connect) { echo 'Server error. Please try again sometime. CON'; }else{ print("<a href=\"http://v-admindb/ci/index.php/main/employees?username=".$_POST["username"]."\">Employees</a>"); echo "<br>"; print("<a href=\"http://v-admindb/ci/index.php/main/visitors?username=".$_POST["username"]."\">Visitors</a>"); }//Just an example to ensure that we get into the function // LOAD LIBRARIES } public function employees() { $this->grocery_crud->set_table('employees'); $output = $this->grocery_crud->render(); $this->_example_output($output); } public function visitors() { $this->grocery_crud->set_table('visitors'); $output = $this->grocery_crud->render(); $this->_example_output($output); } function _example_output($output = null) { $this->load->view('our_template.php',$output); }
}
Вот моя database.php:
$db['default']['hostname'] = 'localhost'; $db['default']['username'] = 'root'; $db['default']['password'] = 'root'; $db['default']['database'] = 'my_new_cms'; $db['default']['dbdriver'] = 'mysql'; $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; //CONNECTION FOR user1 $db['default1']['hostname'] = 'localhost'; $db['default1']['username'] = 'user1'; $db['default1']['password'] = 'user1'; $db['default1']['database'] = 'my_new_cms'; $db['default1']['dbdriver'] = 'mysql'; $db['default1']['dbprefix'] = ''; $db['default1']['pconnect'] = TRUE; $db['default1']['db_debug'] = TRUE; $db['default1']['cache_on'] = FALSE; $db['default1']['cachedir'] = ''; $db['default1']['char_set'] = 'utf8'; $db['default1']['dbcollat'] = 'utf8_general_ci'; $db['default1']['swap_pre'] = ''; $db['default1']['autoinit'] = TRUE; $db['default1']['stricton'] = FALSE; //CONNECTION FOR user2 $db['default2']['hostname'] = 'localhost'; $db['default2']['username'] = 'user2'; $db['default2']['password'] = 'user2'; $db['default2']['database'] = 'my_new_cms'; $db['default2']['dbdriver'] = 'mysql'; $db['default2']['dbprefix'] = ''; $db['default2']['pconnect'] = TRUE; $db['default2']['db_debug'] = TRUE; $db['default2']['cache_on'] = FALSE; $db['default2']['cachedir'] = ''; $db['default2']['char_set'] = 'utf8'; $db['default2']['dbcollat'] = 'utf8_general_ci'; $db['default2']['swap_pre'] = ''; $db['default2']['autoinit'] = TRUE; $db['default2']['stricton'] = FALSE;
Когда я пытаюсь войти в систему, я могу эту ошибку:
Возникла ошибка PHP
Уровень важности: уведомление
Сообщение: Неопределенная переменная: connectdb
Имя файла: controllers / main.php
Номер строки: 12 Обнаружена ошибка
Вы не выбрали тип базы данных для подключения.
Изменение базы данных $ this-> load-> ($ connectdb) на «default», «default1» или «default2» заставляет его работать. Как разместить переменную там, чтобы параметры подключения менялись в зависимости от того, кто входит в систему?
Надеюсь, кто-то может помочь, спасибо! Эрик
Вы должны предоставить всю информацию о базе данных в application/config/database.php´
Обычно вы устанавливаете группу базы данных по умолчанию, например:
$db['default']['hostname'] = "localhost"; $db['default']['username'] = "root"; $db['default']['password'] = ""; $db['default']['database'] = "database_name"; $db['default']['dbdriver'] = "mysql"; $db['default']['dbprefix'] = ""; $db['default']['pconnect'] = TRUE; $db['default']['db_debug'] = FALSE; $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;
Обратите внимание, что данные и параметры входа в систему указаны в массиве с именем $db['default']
.
Затем вы можете добавить другую базу данных в новый массив – назовем ее «anotherdb».
$db['anotherdb']['hostname'] = "localhost"; $db['anotherdb']['username'] = "root"; $db['anotherdb']['password'] = ""; $db['anotherdb']['database'] = "another_database_name"; $db['anotherdb']['dbdriver'] = "mysql"; $db['anotherdb']['dbprefix'] = ""; $db['anotherdb']['pconnect'] = TRUE; $db['anotherdb']['db_debug'] = FALSE; $db['anotherdb']['cache_on'] = FALSE; $db['anotherdb']['cachedir'] = ""; $db['anotherdb']['char_set'] = "utf8"; $db['anotherdb']['dbcollat'] = "utf8_general_ci"; $db['anotherdb']['swap_pre'] = ""; $db['anotherdb']['autoinit'] = TRUE; $db['anotherdb']['stricton'] = FALSE;
Теперь, если вы хотите использовать вторую базу данных, просто
$DB_another = $this->load->database('anotherdb', TRUE);
а затем вместо $this->db->foo()
вы получите $DB_another->foo()
и вы можете распространить это на несколько групп, подобных этому
$DB2 = $this->load->database('anotherdb1', TRUE); $DB3 = $this->load->database('anotherdb2', TRUE);
Для получения дополнительной информации см. Здесь: http://ellislab.com/codeigniter/user-guide/database/connecting.html
Человек, который вы загружаете базу данных в конструкторе. Но $ connectdb создается в функции индекса !! Как получится, что переменная $ connectdb будет инициализирована в конструкторе? Загрузите его в функцию индекса после $ connectdb initialisarion !!!