Использование PEAR для доступа к базе данных
Автор: Андрей Транский
Мы все привыкли к MySQL. Мы любим его за простоту, легкость освоения и множество программ для облегчения работы (phpMyAdmin). Мы делаем скрипты и задумываемся, а вдруг у заказчика стоит другая SQL-база? И вот тут мы начинаем выдумывать или скачивать классы для работы с различными базами. А не проще ли использовать готовое, да ещё к тому же включенное по умолчанию в дистрибутив php?
И вот тут мы начинаем выдумывать или скачивать классы для работы с различными базами. А зачем морочить голову и думать, как проверить, работает ли на остальных SQL базах то, что мы написали? А не проще ли использовать готовое, да ещё к тому же включенное по умолчанию в дистрибутив php? Это прекрасное дополнение к php, о котором вы больше сможете узнать посетив их .
Сегодня попробуем разобраться с их классом DB, отвечающим за доступ к различным базам данных (MySQL, PostgreSQL, Oracle 7/8/8i, Microsoft SQL, InterBase, MiniSQL, SyBase, Informix, FrontBase и универсальный ODBC).
Как ни стандартно, при разработке проектов мы сделаем один файл connect.php, который будет подключатся к нашей базе в каждом скрипте, где это необходимо:
------------- connect.php ------------ <? PHP require_once ( "DB.php"); #подключаем класс DB PEAR $ TypeSQL = "mysql"; $ Host = "локальный"; $ User = "YourPasswordSQL" $ Name = "YourNameSQL"; $ Dbase = "MyDBase"; //Все так же, как и делали раньше, только добавилась переменная $TypeSQL, в которой мы //и указываем, какая у нас База Данных. # прописываем источник DSN http://pear.sourceforge.net/manual/core.db.tut_dsn.php $ DSN = "$ TypeSQL: // $ Пользователь: $ Пароль @ Хост / $ Dbase" $ db = DB :: connect ($ dsn, true); #Что соответствует знакомому по MySQL: mysql_db_connect() и mysql_db_select $ Db-> setFetchMode (DB_FETCHMODE_ASSOC); //выбор формата выбираемых строк. В нашем случае мы используем // fetchRow().А вообще, кому что нравится //http://pear.sourceforge.net/manual/core.db.setfetchmode.php. ?>
Вот, в принципе, и весь наш connect. И если мы захотим использовать другую базу данных, нам в этом скрипте необходимо заменить значение переменной $TypeSQL, к примеру, на "pgsql" (PostgreSQL).
Теперь приступим, собственно, к созданию запросов и работой с нашей базой данных.
<? PHP require_once ( "connect.php"); #Подключаемся к Базе Данных. $ sql = "SELECT * FROM MyTable"; $ res = $ db-> query ($ sql); #Выполняем наш запрос (аналогия mysql_query() ) $ Num = $ res-> NumRows (); #Определяем количество строк (аналогия mysql_num_rows() ) while ($ row = $ res-> fetchRow ()) { $ id = $ row ["id"]; $ name = $ row ["name"]; } #Получаем необходимые нам данные (аналогия mysql_fetch_array() ) #Или другим удобным для Вас методом подробнее http://pear.sourceforge.net/manual/ $ Res-> свободный (); #освобождаем память (аналогия mysql_free_result() ) ?>
Ничего сложного нет. Если вы работали с другими базами кроме MySQL то вы возмутитесь, сказав, что у MySQL есть такой замечательный метод, как auto_increment, а в других базах это реализовано по другому. Попытаюсь объяснить, как НЕ ИСПОЛЬЗОВАТЬ сразу auto_increment с MySQL и потом не иметь головной боли при переходе на другую базу данных.
В PEAR есть замечательная штука Sequence, которая создает новую последовательность с помощью ()
Что бы понять, я объясню проще: в базе данных создается таблица с одним полем, в котором и будет находиться увеличивающееся значение счетчика записей. Сразу скажу, что если вы удалите в середине запись, то последовательность не уменьшится! Т.е. если было 1,2,3,4,5 и вы удалите запись 3 то будет 1,2,4,5.., и следующая последовательность будет 6, а не 3! Последовательность нам необходима, когда мы делаем вставку в базу данных, т.е. INSERT
<? PHP require_once ( "connect.php"); $ id = $ db-> nextID (w_, MyTable); # Эта функция возвращает следующее число, находящееся в таблице последовательности. # Если таблица последовательности еще не была создана, то она создается. # В скобках пишется имя таблицы последовательности. # для удобства используется имя таблицы данных и приставка w_ для того, что бы все # таблицы последовательностей находились внизу при просмотре всей базы. # Не забудь! При создании таблицы НЕ УКАЗЫВАТЬ auto_increment в MySQL или другие # увеличения в других базах. PEAR сделает все сам. $ sql = "INSERT INTO MyTable VALUES ('$ id', '$ name')"; $ res = $ db-> query ($ sql); $ Res-> свободный (); ?>
Внимательный читатель сделает замечание: "А обработка ошибок?!" И будет прав. Мы здесь её нигде не делали. Для обработки ошибок будем использовать PEAR. Подробнее можно почитать .
Мы же здесь используем обработчик ошибок (режим PEAR_ERROR_CALLBACK) на основании нашей функции, который будет вызываться и останавливать работу в любом месте программы, где вызвана ошибка, с подробным описанием. Для этого используем наш файл connect.php
<? PHP define (DEBUG_ENV, правда); #Устанавливаем именованную константу. И когда наш сайт готов и мы можем его #использовать, устанавливаем в FALSE, что бы нашим пользователем не выдавался код и #сообщение, а просто стандартное сообщение на ошибку. функция handle_pear_error ($ error_obj) { если (DEBUG_ENV) { die ($ error_obj-> getMessage (). " ". $ error_obj-> getDebugInfo ()); } еще { die("Ваш запрос не выполнен. Повторите попытку позже."); } } # функция обработки ошибок PEAR :: setErrorHandling (PEAR_ERROR_CALLBACK, 'handle_pear_error'); #Устанавливаем, что при возникновении ошибки использовать нашу функцию. ?>
Вот, собственно, и всё. Более подробную информацию о PEAR, где есть и шаблоны, и работа с почтой, и многое другое, вы можете узнать, посетив или .
Цель данной статьи - не конкуренция мануалу, а возможность дать понять, что иногда не стоит изобретать велосипед, а "стоит посмотреть под ноги" и увидеть, что многое есть уже готовое, да к тому же официально включено в PHP по умолчанию. А это много значит.
Источники информации
- <