-
Notifications
You must be signed in to change notification settings - Fork 11
intro
Сия документация писалась в достаточно стародавние времена. Когда люди ещё использовали mysql_функции, а ООП был в диковинку. Так что некоторое из ниже написанного может показаться неактуальным.
Если кратко: это библиотека для работы с базами данных на низком уровне. Она упрощает интерфейс доступа к БД, но не создаёт надстроек над SQL.
То есть, библиотека той же ниши, что и PDO. В отличии от PDO:
- Более развитая система плейсхолдеров.
- Более удобный разбор результата.
- Много дополнительных небольших плюшек.
Таким образом, библиотеку можно использовать:
- Для работы с базой на уровне запросов.
- Для того, чтобы построить на её основе какую-нибудь надстройку (ORM, например).
- Не использовать вообще.
При взаимодействии между 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 предоставляет собственные средства для её решения. Также библиотека позволяет описывать все нужные базы данных в одном месте (конфигурационный файл), но подключаться к ним только в случае необходимости.
Более подробно см. хранилище объектов подключений.