Pull to refresh

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
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.