Как стать автором
Обновить

Database — библиотека на PHP для работы с MySql. Презентация решения

Не так давно я устроился на новую работу и впервые столкнулся с популярным фреймворком. Мне необходимо было написать большой SQL-запрос. Я его написал, сделал bindValue, запустил сценарий и… запрос завершился с ошибкой. Я очень надеялся, что фреймворк позволит мне получить полноценный SQL-запрос, что бы я смог его отладить. Но не тут то было — фреймворк не позволял сделать ничего подобного. Ровно, как и PDO/mysqli не позволяют этого до сих пор.

Современные средства для работы с базой 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
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.