2015-06-08 2 views
3

У меня есть база данных в mysql. В приложении php я хочу создать текстовое поле и разрешить пользователям писать «запрос» для фильтрации данных в таблице.PHP: Каков наилучший способ создания языка запросов более высокого уровня для создания фильтра критериев в yii

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

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

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

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

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

+0

Regexp не является хорошим решением, напишите лексер вместо –

+0

@MarkBaker Спасибо за ответ. Знаете ли вы что-нибудь, на что я должен пойти? Я понятия не имею, как начать. – Jamol

+0

Создайте ввод формы, иначе пользователи могут ошибаться. – sln

ответ

1

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

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

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