goDB — идеология и основные принципы

При взаимодействии между PHP и MySQL затрагиваются две области:

  1. Язык SQL и его реализация в MySQL.
  2. Набор функций и классов PHP, предоставляющих интерфейс для доступа к MySQL.

Как показывает практика, попытка построить над языком SQL какую-либо абстракцию средствами PHP, обычно не приводит ни к чему хорошему. В большинстве случаев получаются громоздкие, медленные, не расширяемые монстры.

Данная библиотека не пытается сделать ничего подобного, а всецело направленна только на улучшение интерфейса. Рассмотрим элементы стандартного интерфейса, которые было бы желательно улучшить. А для начала приведём два примера.

Пример 1. Получение идентификатора пользователя по введенным логину и паролю «дедовским» способом:


$login  = mysql_real_escape_string($_POST['login']);
$passwd = mysql_real_escape_string($_POST['password']);
$query  = 'select `user_id` form `users` where `login`="'.$login.'" AND `password`=md5("'.$password.'")';			
$result = mysql_query($query) or die($query.' - '.mysql_errno().' - '.mysql_error());
if (mysql_num_rows($result) == 0) {
	echo 'Мы вас не знаем';
	exit();
} 
$result = mysql_fetch_row($result);
$userId = $result[0];
			

Пример 2. Тоже самое с помощью goDB:


$userId = $db->query('select `user_id` from `users` where `login`=? AND `password`=?', array($_POST['login'], $_POST['password']), 'el');
if (!$userId) {
	echo 'Мы с вами не знакомы';
}
			

Процедурный подход против объектного

Старое php-расширение mysql, которым до сих пор пользуется большинство программистов, предоставляло для доступа к БД набор функций вида mysql_query(), mysql_connect() и т.п. В итоге, как часто это бывает в процедурном программировании, код превращался в кашу. Особенно неудобно было использовать несколько баз данных в одном сценарии — приходилось повсюду таскать за собой идентификаторы подключения. Кроме того, данное расширение не поддерживало многих возможностей новых версий mysql, таких, как, например, множественные запросы.

К счастью, с тех пор появились библиотеки, предоставляющие объектный синтаксис. Например, mysqli.

goDB является именно расширением над классом mysqli. Сохраняя почти все методы и не привнося своих ограничений, goDB расширяет функционал mysqli.

Формирование запроса

При работе напрямую с mysql-функциями, формирование запроса превращается в сущий кошмар. Бесконечные mysql_real_escape_string(), кавычки, приведения типов... Где-нибудь забыли проэкранировать вставляемую переменную и вот уже потенциальная ошибка, а то и уязвимость.

В mysqli, правда, появилась возможность создания подготовленных выражений. Однако, в рамках веб-сценариев польза от них не так велика, как хотелось бы, так как обычно запросы выполняются по одному разу в рамках процесса.

goDB для корректной вставки данных в запрос использует механизм плейсхолдеров. Вы указываете входные данные и места в которые их следует вставлять. Более подробно об этом написано в разделе «выполнение запроса».

Еще раз повторюсь: библиотека не накладывает ограничений. Вы можете пользоваться плейсхолдерами, обычными запросами или подготовкой выражений, в зависимости от задачи.

Разбор результата

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

При разборе результата с использованием mysqli, процедурный синтаксис меняется на объектный, но суть остаётся прежней.

goDB позволяет получать результат в большинстве используемых форматов (ассоциативный массив, одно значение и т.п). Если ни один из форматов вас не устраивает, вы можете получить старый добрый resource и разобрать его дедовскими методами.

В большинстве случаев даже не требуется выполнять разбор отдельно от запроса. Формирование запроса, выполнение и формирование удобного результата можно выполнить вызовом одного метода.

Более подробно см. «форматы разбора запроса».

Обработка ошибок

В goDB используются исключения. Это позволяет значительно повысить устойчивость программ и избавить программиста от множества сложного кода, по отслеживанию ошибок.

Более подробно см. «обработка ошибок».

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

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

Более подробно см. «пространство имен».

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