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