Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

И всё-таки, как «верно» исполнять из PHP трудные sql-запросы?

Anna | 31.05.2014 | нет комментариев

Года три назад попросили меня написать простенькую софтинку на PHP для печати счетов. Так уж получилось, что логика СУБД (MSSQL), на которую опиралась эта софтина, была крайне монструозна — около восьмиста таблиц, перепутанных взаимными связями. Следственно множество запросов включали в себя условные вызовы аггрегирующих функций (самое примитивное — sum(when eq then a else 0 end)), PIVOTUNPIVOT и тому сходственное.

C учетом моего не слишком уж большого навыка на тот момент я решил не ввязываться в data mappingactive record и легко закинул запросы в текстовые файлы, сделал в них текстовые плейсхолдеры типа {PARAM1} и написал функцию, заменяющую текст плейсхолдера на значения переменных из ассоциативного массива.

С тех пор прошло много времени — софтинка обзавелась аджаксовой мордочкой, мигрировала на мой любимый CI, обзавелась двумя десятками модулей, содержащих каждую аналитику. Постоянным оставался лишь метод вызова SQL-запросов — ассоциативный массив, текстовый файл, плейсхолдеры.

И, что восхитительно, всё это бесчинство работает и по сей день. Правда, число костылей и подпорок теснее начинает слегка нервировать.
А именно — ручной escaping, type-checking, в конце концов — не работает ctrl пробел. Я уж промолчу про то, что отладка запросов типично не работает из-за «неродных» плейсхолдеров, и syntax check в PhpStorm из-за этого сходит с ума. А совместно с ним и я, помаленьку.

Doctrine на такой трудности запросов трансформирует двухстрочный вызов в что-то невообразимое, а про размер схемы я легко тактично умолчу. Родные плейсхолдеры (:PARAM) не умеют содержать в себе куски запроса. А у нас автогенерация во все поля, кастомные фильтры, отключаемые джойны из внешних СУБД, находящихся за 4-5 тыс км от нашей серверной комнаты. Паника, боль, унижение.

В всеобщем, родился план. Делаем класс Query с тайп-чекингом, возвратом итогов в XML (да, есть и такое) либо в массиве. Дальше делаем кучу преемников для всякого отдельного SQL-запроса, у которых в public -сегменты висит класс с перечисленными входными параметрами. А дальше всё так же — текстовый файл и плейсхолдеры.

Обратно — либо массивом, либо XML, либо некоторым классом подобно ResultSet->First (next,last).

Всё это до боли напоминает изобретение велосипеда. Подозреваю, что всё это теснее написано до нас. Но беглый гуглеж не помог. Может, кто сталкивался с такими вещами?

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB