Работа с SQL-запросами и БД: классы sqlRaw и fenDB
В большинстве случаев работа модуля сводится к составлению SQL-запроса в зависимости от принятых параметров, извлечению данных из БД и их преобразованию в DOM-дерево. Чтобы упростить решение этих задач, Fenrir предоставляет разработчику 2 служебных класса, фактически, это "рабочие лошадки" для большинства проектов.
sqlRaw
Класс sqlRaw предназначен для формирования SQL-запросов любой сложности при помощи объектно-ориентированного интерфейса. Фактически, sqlRaw - реализация паттерна queryObject. Использование такого подхода позволяет создавать читаемый код, легко поддающийся рефакторингу и декомпозиции.
В Fenrir не реализован ORM, более высокоуровневый слой доступа к данным, однако в большинстве случаев качество кода из-за этого не страдает, зато разработчик получает больше свободы, что позволяет писать действительно эффективные, хорошо оптимизированные запросы. sqlRaw поддерживает большинство употребимых конструкций языка SQL, в частности - подзапросы в блоках SELECT, FROM и WHERE, конструкцию UNION, модификатор SQL_CALC_FOUND_ROWS, управление оптимизатором (USE INDEX) и многие другие.
Еще одно преимущество использования данного класса лежит в области безопасности. Все данные, используемые в запросе, проходят проверку и экранирование, что позволяет надежно (и при этом - прозрачно) защитить приложение от SQL-инъекций.
Вот пример использования данного класса:
Получается примерно такой запрос:
SELECT `G`.`name` AS `good_name` , `G`.`price` AS `good_price`
FROM `good` AS `G`
INNER JOIN `section` AS `S`
ON G.section_id = S.id
INNER JOIN (
SELECT `PM`.`section_id`
FROM `section_permission` AS `PM`
WHERE (`PM`.`user_group` = `moderator` OR `PM`.`allow_anybody` = '1')
AND `PM`.`is_active` = '1'
) AS `SUBQ`
ON SUBQ.section_id = S.id
WHERE `S`.`id` IN ('1', '2', '3')
ORDER BY `G`.`availability` ASC, `G`.`price` DESC
fenDB
Класс fenDB реализует слой абстракции БД уровня API (API level Database Abstraction Layer). Реализация данного класса инкапсулирует функции доступа к конкретным СУБД (такие, как mysql_query / pg_query и т.д.), предоставляя разработчику единый интерфейс доступа. Это позволяет при необходимости легко переключаться между различными СУБД, не переписывая всех исходников (однако, это не относится к различиям в реализации языка SQL, которые, впрочем, в большинстве случаев минимальны).
Кроме того, класс fenDB содержит ряд методов, упрощающих выборку данных и отладку запросов, в частности - таймер, считающий время исполнения запроса.
Вот примеры использования данного класса:


