понедельник, 4 февраля 2019 г.

Использование PEAR для доступа к базе данных

Использование 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, которая создает новую последовательность с помощью createSequence()
Что бы понять, я объясню проще: в базе данных создается таблица с одним полем, в котором и будет находиться увеличивающееся значение счетчика записей. Сразу скажу, что если вы удалите в середине запись, то последовательность не уменьшится! Т.е. если было 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, где есть и шаблоны, и работа с почтой, и многое другое, вы можете узнать, посетив официальную страничку PEAR или русскоязычную документацию.
Цель данной статьи - не конкуренция мануалу, а возможность дать понять, что иногда не стоит изобретать велосипед, а "стоит посмотреть под ноги" и увидеть, что многое есть уже готовое, да к тому же официально включено в PHP по умолчанию. А это много значит.
Источники информации