Database — библиотека на PHP для работы с MySql. Презентация решения
Ожидает приглашения
Не так давно я устроился на новую работу и впервые столкнулся с популярным фреймворком. Мне необходимо было написать большой SQL-запрос. Я его написал, сделал bindValue, запустил сценарий и… запрос завершился с ошибкой. Я очень надеялся, что фреймворк позволит мне получить полноценный SQL-запрос, что бы я смог его отладить. Но не тут то было — фреймворк не позволял сделать ничего подобного. Ровно, как и PDO/mysqli не позволяют этого до сих пор.
Современные средства для работы с базой MySql в PHP, будь то абстракция PDO или расширения mysql и mysqli — просто не предназначены для «клиентского» кода. Об этом очень хорошо написали на хабре еще в 2012 году. Есть две основных причины, по которым использовать родные инструменты в «голом» виде просто невозможно. Это:
Не долго думая, я все же решил представить миру свое решение, которое уже достаточно давно работает в моих проектах. Эта библиотека представляет собой удобный инструмент для работы с обычным SQL в рамках СУБД MySQL — и не более того. Это важно — я не стал идти по пути других разработчиков различных библиотек, которые по факту пишут сами не понимают что — то ли построители запросов (sql builders), то ли подобие ActiveRecord библиотек, то ли вообще симбиоз из нескольких слоёв. Библиотека Database — это «низкоуровневый» слой, лежащий над стандартным mysqli.
В библиотеке два основных метода для выполнения запросов — методы query() и queryArguments(), работающих в составе обертки над стандартным объектом mysqli. Эти методы возвращают результативный объект, который также представляет собой обертку над стандартным mysqli_result.
Все просто и ясно. Ничего лишнего.
Основное достоинство библиотеки — это эмуляция подготовленных запросов, удобная работа с заполнителями (placeholders). Параметры запроса передаются отдельно от SQL, а в самом SQL на месте, где должны присутствовать параметры запроса, пишутся специальные типизированные маркеры. Парсер библиотеки находит эти маркеры, определяет их тип и в зависимости от типа маркеров, занимается преобразованием параметров запроса и их подстановкой в исходную строку SQL-запроса.
Приведу пример работы.
Таким образом:
Более подробное описание и примеры можно посмотреть на сайте проекта: www.database.phpinfo.su
Ссылка на репозиторий: github.com/Vasiliy-Makogon/Database--class-PHP-Mysql-prepare-placeholders
Современные средства для работы с базой MySql в PHP, будь то абстракция PDO или расширения mysql и mysqli — просто не предназначены для «клиентского» кода. Об этом очень хорошо написали на хабре еще в 2012 году. Есть две основных причины, по которым использовать родные инструменты в «голом» виде просто невозможно. Это:
- Многословность — на каждый запрос приходится писать по несколько однотипных строк кода
- Невозможность получить SQL запрос для отладки — функция, которой просто катастрофически не хватает
Не долго думая, я все же решил представить миру свое решение, которое уже достаточно давно работает в моих проектах. Эта библиотека представляет собой удобный инструмент для работы с обычным SQL в рамках СУБД MySQL — и не более того. Это важно — я не стал идти по пути других разработчиков различных библиотек, которые по факту пишут сами не понимают что — то ли построители запросов (sql builders), то ли подобие ActiveRecord библиотек, то ли вообще симбиоз из нескольких слоёв. Библиотека Database — это «низкоуровневый» слой, лежащий над стандартным mysqli.
В библиотеке два основных метода для выполнения запросов — методы query() и queryArguments(), работающих в составе обертки над стандартным объектом mysqli. Эти методы возвращают результативный объект, который также представляет собой обертку над стандартным mysqli_result.
Все просто и ясно. Ничего лишнего.
Основное достоинство библиотеки — это эмуляция подготовленных запросов, удобная работа с заполнителями (placeholders). Параметры запроса передаются отдельно от SQL, а в самом SQL на месте, где должны присутствовать параметры запроса, пишутся специальные типизированные маркеры. Парсер библиотеки находит эти маркеры, определяет их тип и в зависимости от типа маркеров, занимается преобразованием параметров запроса и их подстановкой в исходную строку SQL-запроса.
Приведу пример работы.
<?php
// Соединение с СУБД и получение объекта Database_Mysql
// Database_Mysql - "обертка" над "родным" объектом mysqli
$db = Database_Mysql::create("localhost", "root", "password")
// Выбор базы данных
->setDatabaseName("test")
// Выбор кодировки
->setCharset("utf8");
// Получение объекта результата Database_Mysql_Statement
// Database_Mysql_Statement - "обертка" над "родным" объектом mysqli_result
$result = $db->query("SELECT * FROM `users` WHERE `name` = '?s' AND `age` = ?i", "Д'Артаньян", 30);
// Получаем данные (в виде ассоциативного массива, например)
$data = $result->fetch_assoc();
// Получим количество рядов в результате
$result->getNumRows();
// Не работает запрос? Не проблема - выведите его на печать:
echo $db->getQueryString();
// Получить все SQL-запросы текущего соединения
print_r($db->getQueries());
Таким образом:
- Ваш код становится короче — выполнение запросов пишется в одну строку
- Надежная защита от SQL-инъекций. Никаких mysqli_real_escape_string() и intval()
- Экранирование символов для оператора LIKE
- Несколько полезных плейсходеров — как для подготовки скалярных типов, так и создания множеств из массивов
- Возможность получать все SQL-запросы текущего соединения, как до процедуры парсинга, так и после
- Прозрачный и понятный код, доступный для расширения и модификации
Более подробное описание и примеры можно посмотреть на сайте проекта: www.database.phpinfo.su
Ссылка на репозиторий: github.com/Vasiliy-Makogon/Database--class-PHP-Mysql-prepare-placeholders