Главная / Техно /

Работа с SQL

Работа с 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 содержит ряд методов, упрощающих выборку данных и отладку запросов, в частности - таймер, считающий время исполнения запроса.

Вот примеры использования данного класса: