Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Компоновщик MYSQL запросов


Автор: maxipub 2.5.2014, 10:14
Добрый день!

Ребята, подскажите, какие есть инструменты для сабжа?

Предположим, у нас есть некий запрос. Скажем, это форум, и запрос выводит список пользователей, которые оставляли сообщения в определенном разделе форума. Это наш исходных запрос.

Далее, на страничке размещаются дополнительные фичи, которые уточняют этот исходный запрос, например, все тот же "вывод списка пользователей, которые оставляли сообщения в определенной разделе форума":

- за последний месяц;
- эти сообщения - новые темы;
- сортировать по дате сообщения;
- сортировать по дате обновления топиков с этими сообщениями.

И т.д., иными словами, имеем исходный запрос, который не изменяется, а дополняется некоторыми условиями. Можно сделать ряд однотипных запросов, которые будут срадабывать по условию... но хотелось бы как-то красивее. Думаю, должны существовать некие компоновщики запросов?

За терминологию и возможное невежество не судите строго, самоучка. smile

Пока единственное, что пришло на ум, собирать запрос через массив. Будет некоторая избыточность, но, в общем, должно работать. Где-то так:

Код

$SQL = array();

$SQL['select'][] = 'table1.field, table2.field FROM table1';
$SQL['inner_join'][] = 'table2 ON table2.id=table1.id';
$SQL['where']['and'][] = 'table1.id=1';


Если имеются модификаторы, мы их просто добавляем в массив, например:

Код

if (isset($_POST['last_month']))
$SQL['where']['and'][] = 'table2.date>='.(time()-60*60*24*31);


Ну и дальше по логике из массива компонуем SQL запрос. Это пока только задумка. Уверен, есть практические реализации, вот их и хотел бы посмотреть, зачем изобретать велосипед? Лучше взять за основу готовый. smile Буду рад любой помощи и подсказкам. Заранее спасибо!

Автор: Aliance 5.5.2014, 10:27
Можно использовать Zend_Db, т.к. компоненты zend framework можно использовать по-отдельности.
И, кстати, вариант с where не самый лучший, т.к. нужно заботиться об экранировании. Лучше в таком случае использовать placeholder`ы (смотри в сторону PDO)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)