sql — PHP: как лучше создать язык запросов более высокого уровня для создания фильтра критериев в yii

У меня есть база данных в MySQL. В приложении php я хочу создать текстовую область и позволить пользователям написать «запрос» для фильтрации данных в таблице.

Я хочу создать анализатор запросов для пользователей, чтобы фильтровать данные, написав запрос. Например:

name="John" AND (age > 20 OR status = 1)

Что-то вроде этого. Это то, что пользователи будут вводить и нажимать кнопку поиска, и система создает sql-запрос из «запроса», предоставленного пользователем, и возвращает отфильтрованные результаты. В приведенном выше примере он создаст SQL-запрос следующим образом:

SELECT * FROM users WHERE name="John" AND (age>20 OR status=1)

Я думаю о синтаксическом анализе этого запроса с помощью регулярных выражений и создания sql из него. Есть ли лучший подход?

5

Решение

Из-за гибкости SQL, а также для обеспечения безопасности, вы захотите использовать лексер. Таким образом, вы можете разрешать очень сложные запросы, проверять каждое поле и значение и предоставлять полезную обратную связь по ошибкам. Я могу придумать два хороших варианта:

Если пользовательский ввод является относительно простым (например, без подвыборов), то не займет много времени, чтобы определить наборы запросов, которые вы хотите поддерживать, используя лексер, уже написанный на PHP, например Phlexy.

Если вам нужна более надежная поддержка SQL, я бы предложил Antlr, поскольку он уже поддерживает различные формы SQL. Недостатком является то, что на данный момент PHP не является поддерживаемым целевым языком, поэтому интеграция будет более сложной.

2

Другие решения

Других решений пока нет …