Skip to content
Oleg Grigoriev edited this page Mar 27, 2016 · 9 revisions

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

Предисловие к последнему изданию

Сия документация писалась в достаточно стародавние времена. Когда люди ещё использовали mysql_функции, а ООП был в диковинку. Так что некоторое из ниже написанного может показаться неактуальным.

Если кратко: это библиотека для работы с базами данных на низком уровне. Она упрощает интерфейс доступа к БД, но не создаёт надстроек над SQL.

То есть, библиотека той же ниши, что и PDO. В отличии от PDO:

  1. Более развитая система плейсхолдеров.
  2. Более удобный разбор результата.
  3. Много дополнительных небольших плюшек.

Таким образом, библиотеку можно использовать:

  1. Для работы с базой на уровне запросов.
  2. Для того, чтобы построить на её основе какую-нибудь надстройку (ORM, например).
  3. Не использовать вообще.

Введение

При взаимодействии между 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` FROM `users` WHERE `login`="'.$login.'" AND `password`=md5("'.$passwd.'")';
$result = mysql_query($query) or die($query.' - '.mysql_errno().' - '.mysql_error());
if (mysql_num_rows($result) == 0) {
    echo 'User not found';
    exit();
}
$result = mysql_fetch_row($result);
$userId = $result[0];

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

$pattern = 'SELECT `user_id` FROM `users` WHERE `login`=? AND `password`=md5(?)';
$data    = array($_POST['login'], $_POST['password']);
$userId  = $db->query($pattern, $data, 'el');
if (!$userId) {
    echo 'User not found';
}

Объектный подход вместо процедурного

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

Несмотря на то, что давно появились объекто-ориентированные расширения (PDO, MySQLi, SQLite3), большинство программистов до сих пор пользуется старыми.

goDB предоставляет лаконичный объектно-ориентированный интерфейс.

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

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

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

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

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

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

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

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

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

Более подробно см. разбор результата запроса.

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

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

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

Отложенное подключение

Подключение к базе данных, обычно, производится на этапе инициализации сценария. После чего подключение держится до окончания работы сценария.

При этом, некоторые сценарии могут совсем не содержать обращений к базе. Таким образом трудоёмкая операция установки подключения оказывается излишней.

Даже, если запрос всё-таки происходит, но ближе к концу сценария, всё равно получается, что PHP держал соединение на несколько долей секунды дольше чем ему требовалось. На нагруженных проектах это может привести к нежелательным последствиям.

Один из выходов из положения, перед каждым запросом проверять, есть ли подключение и если нет - создавать. Но это лишняя рутина, череватая ошибками.

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

Более подробно см. соответствующий раздел.

Адаптеры различных баз

goDB позволяет работать с различными типами баз данных, за счёт системы адаптеров (или драйверов).

Следует понимать, что в первую очередь это позволяет работать с различными базами через единообразный интерфейс. Но в каждом случае следует заранее знать с какой базой вы работаете.

То есть, если у вас проект на MySQL, то вряд ли его можно перенести на PostgreSQL за счёт только одной замены адаптера.

goDB не занимается выравниванием интерфейса. И если в MySQL есть автоинкремент, а в Постгре нет, то его там и не появится.

Пространство имён (хранилище объектов)

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

Более подробно см. хранилище объектов подключений.

Clone this wiki locally