Использование класса DB_Sql лучше всего проиллюстрировать небольшим примером. Исходный код, приведенный в листинге 6.1, обращается к базе данных и выводит на экран все строки соответствующей таблицы. В этом примере используется класс Example_Db; он определяется в файле local.inc, который расширяет класс DB_Sql и показывает, каким образом программист может создавать собственные классы. Для простоты мы воспользуемся примером, позаимствованным из дистрибутива библиотеки PHPLib.
Листинг 6.1. Первый пример использования DB_Sql
-
//создать экземпляр класса DB_Sql
-
$db = new Example_DB;
-
//подключиться к реляционной СУБД
-
$db->connect("test", "localhost", "root", "");
-
//создать инструкцию SQL
-
$sql = "SELECT * FROM test";
-
//выполнить запрос
-
$db->query($sql);
-
//просмотреть результат
-
while($db->next_record())
-
{
-
//просмотреть хэш-таблицу $db->Records
-
while(list($key, $value) = each($db->Record))
-
{
-
//выводить только нечисловые индексы
-
print(is_string($key) ? "$key: $value
":"");
-
}
-
print("
");
-
}
В первой строке создается новый экземпляр класса DB_Sql. По умолчанию этот класс определяется в файле db_mysql.inc (загружаемом в сценарии prepend.php3); в качестве СУБД используется MySQL.
Следующим шагом является подключение к базе данных. Разумеется, вы должны заменить константы, указанные в листинге, теми, которые вам нужны. В этом примере мы устанавливаем связь с базой данных test, находящейся на хосте localhost; имя пользователя - root, пароль отсутствует.
Значения этих свойств можно задать и явным образом, через соответствующие переменные класса.
-
$db = new Example_Db;
-
$db->Database = 'test';
-
$db->Host = 'localhost';
-
$db->User = 'root';
-
$db->Password = '';
При вызове функции $db->query() библиотека PHPLib заметит, что соединение еще не установлено, и откроет его автоматически, используя заданные значения перечисленных переменных класса.
Наш пример продолжает вызов функции $db->query(), которая осуществляет все необходимые операции, чтобы послать запрос базе данных. Эта функция устанавливает соединение с выбранной базой данных (если оно еще не установлено) и обрабатывает возникающие ошибки. Если мы установили значение переменной $db->Debug равным true, данная функция будет выводить строку запроса SQL перед передачей его в базу данных.
Затем в цикле while вызывается функция $db->next_record(). Она получает очередную строку результирующего набора записей и сохраняет ее в массиве $db_Record. Если строк больше нет, то функция возвращает false, и цикл заканчивается.
Второй цикл просматривает массив $db_Record и выводит имена полей и их содержимое. Поскольку в этом массиве в качестве ключа может выступает как числовой индекс (аналогично массивам, возвращаемым по умолчанию функцией mysql_fetch_array()), так и имя поля, мы должны удостовериться в том, что будет осуществляться вывод только тех элементов, для которых в качестве индекса используется имя поля.
Сравните пример использования библиотеки PHPLib, содержащийся в листинге 6.1, с образцом традиционного стиля программирования, приведенным в листинге 6.2. Оба текста примерно одинаковы по размеру, но листинг 6.1 наглядно демонстрирует все преимущества использования PHPLib, о которых мы говорили выше. Изменив один файл, вы можете подключить иной уровень базы данных. Средства обработки ошибок здесь более мощные, чем во втором примере. При возникновении ошибки, изменив всего одну переменную класса, можно прервать работу библиотеки PHPLib, сообщить об этой ошибке или проигнорировать ее, в то время как традиционные методы программирования позволяют только прекратить работу приложения. Наконец, в вашем распоряжении имеется полная встроенная поддержка отладки.
Листинг 6.2. Образец реализации традиционного подхода
-
//подключиться к реляционной СУБД
-
$link =mysql_connect('localhost', 'root', '') or die(mysql_error());
-
//выбрать базу данных
-
$db = mysql_select_db('test') or die(mysql_error());
-
//создать оператор SQL
-
$sql = "SELECT * FROM test"
-
//выполнить запрос
-
$res = mysql_query($sql) or die(mysql_error());
-
//просмотреть множество результатов
-
while($row = mysql_fetch_array($res))
-
{
-
//просмотреть хэш-таблицу $db->Records
-
while(list($key, $value) = each($row))
-
{
-
//выводить только нечисловые индексы
-
print(is_string($key) ? "$key: $value
" : "");
-
}
-
print("
");
-
}
Обратите внимание на один нюанс. В приложении вы можете работать только с одной базой данных. В системе PHP не очень удачно реализован доступ из одного сценария к различным базам данных, особенно к базам данных в формате MySQL. Интерпретатор PHP предполагает, что может повторно использовать ранее установленные соединения, применив то же самое имя и пароль. Взгляните на следующий пример.
-
$res_one = mysql_connect("localhost", "root", "") or die(mysql_error());
-
$res_two = mysql_connect("localhost", "root", "") or die(mysql_error());
Вы могли бы подумать, что здесь два разных идентификатора соединения? Это не так, поскольку при втором вызове функции mysql_connect() интерпретатор PHP использует открытое соединение повторно. Если вы выведете значения идентификаторов соединений $res_one и $res_two, то увидите один и тот же идентификатор ресурса для обеих переменных. В результате использование функции mysql_select_db() для одного соединения меняет контекст для другого соединения. Аналогичная ситуация возникает и при использовании одной базы данных для объекта DB_Sql, а другой - для данных сеанса. К сожалению, приемлемого решения этой проблемы в настоящее время не существует.