goDB — идеология и основные принципы
При взаимодействии между PHP и MySQL затрагиваются две области:
- Язык SQL и его реализация в MySQL.
- Набор функций и классов 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 предоставляет собственные средства для её решения. Так же библиотека позволяет описывать все нужные базы данных в одном месте (конфигурационный файл), но подключаться к ним только в случае необходимости.
Более подробно см. «пространство имен».