Пространство имён

Обычно подключение (подключения) создается в начале работы сценария, а потом используется на всём его протяжении. При этом возникает вопрос, а где хранить объекты баз и как их получать в прикладном коде. Часто данный вопрос решается банально и вульгарно — глобальными переменными. Такое решение наследует все минусы подхода по хранению большого количества данных в глобальной области.

goDB предоставляет возможность хранения объектов баз данных в самом подходящем месте — в самой библиотеке. То есть, в статических свойствах класса goDB. Каждой базе пользователь назначает имя, под которым она и доступна.

Запись базы в пространство имен:


void goDB::setDB(goDB $db [, string $name])			
			

Получение базы из пространства имен:


goDB goDB::getDB($db [, string $name])			
			

Пример использования:


/* В начале */
goDB::setDB($db, "myDB");

...

/* Где-то в недрах сценария */
$db = goDB::getDB("myDB");
$db->query(....);
...
			

Создание базы и сохранение её в пространстве имен:


goDB goDB::makeDB(string $host, string $user, string $password, string $dbname [, string $name [, bool $post])
goDB goDB::makeDB($config)
			

То есть, в данном случае можно и не использовать setDB. Кроме того, есть возможность создать отложенное подключение (см. ниже).

Выполнение запроса:


mixed $db->queryDB(string $pattern [, array $data, string $fetch [, string $prefix [, string $name])
			

Таким образом, если в какой-то функции база нужно только для запроса, нет необходимости доставать её объект — можно сразу выполнить запрос.

Имя по умолчанию

Во всех приведенных методах можно не указывать параметр $name. Тогда в качестве имени будет использоваться имя по умолчанию «base».

Это удобно, когда в сценарии используется всего одна база или одна из баз является главной. Не нужно заморачиваться на имена. В следствии этого, взаимодействие с БД можно сократить до:


/* В начале */
goDB::makeDB("localhost", "user", "password", "dbname");

...

/* Где-то в недрах сценария */
$result = goDB::queryDB("select * from ?t", Array("table"), "assoc");
...	
			

Отложенное подключение

Обычно параметры баз задаются в начале сценария (например, при подключении конфигурационного файла). При этом не обязательно, что в конкретном сценарии будут использованы они все. Не обязательно даже, что в нём будет хотя бы один запрос. При этом каждый раз совершать лишнее подключение накладно.

При создании базы с помощью goDB::makeDB() можно установить параметр $post (или элемент конфиграционного массива postmake) в TRUE. В этом случае объект базы данных не будет создаваться немедленно. Создание объекта и подключение к базе произойдет непосредственно при первом запросе через базу (queryDB) или при попытке получить её (getDB).

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

Ссылки

Допустим, мы предполагаем использовать три базы данных:


$config = array(
	array(
		'name'     => 'one',
		'host'     => '...',
		'username' => '...',
		...
	),
	array(
		'name'     => 'two',
		'host'     => '...',
		'username' => '...',
		...
	),
	array(
		'name'     => 'three',
		'host'     => '...',
		'username' => '...',
		...
	),		
);
foreach ($config as $dbconf) {
	goDB::makeDB($dbconf);
}
/* Обращение к базе "two" */
$db = goDB::getDB('two');
			

В тоже время на начальном этапе вместо трёх может использоваться одна, просто, с тремя именами. В этом случае не нужно писать одни и теже параметры:


$config = array(
	array(
		'name'     => 'one',
		'host'     => '...',
		'username' => '...',
		...
	),
	array(
		'name'     => 'two',
		'link'     => 'one',
	),
	array(
		'name'     => 'three',
		'link'     => 'one',
	),		
);
			

В этом случае на имена two и three будет откликаться one.

Аналогично их можно ассоциировать через специальный метод:


goDB::assocDB('two', 'one');
goDB::assocDB('three', 'one');
			

Исключения

При работе с пространством имен могут возникать исключения goDBExceptionDBAlready (попытка сохранить базу под уже занятым именем) и goDBExceptionNotFound (попытка доступа к несуществующему имени).

© Григорьев Олег aka vasa_c, 2006—2010