Разбор предложения SELECT SQL-запросов в массив PHP - PullRequest
3 голосов
/ 11 февраля 2011

Это больше для анализа запроса в PHP ДО того, как он будет отправлен на сервер.Очень сложно, почему я это делаю, поэтому я не буду вдаваться в причину этого.

В PHP мне нужно сохранить выбор полей в массиве php.Возьмем для примера этот запрос:

SELECT user_id,username,DATE(join_datetime) as join_date, (SELECT COUNT(1) FROM foobar WHERE foonum IN (5,4,6) and user_id = users.user_id) as myfoo_count 
FROM users 
WHERE user_id = 123

Итак, в этом случае мне нужно сохранить "user_id, username, DATE (join_datetime) как join_date, (SELECT COUNT (1) FROM foobar WHERE foonum IN (5, 4,6) и user_id = users.user_id) как myfoo_count "в массив, разнесенный запятой (,).Таким образом, я получил бы:

array (
  [1] => 'user_id',
  [2] => 'username',
  [3] => 'DATE(join_datetime) as join_date',
  [4] => '(SELECT COUNT(1) FROM foobar WHERE foonum IN (5,4,6) and user_id = users.user_id) as myfoo_count'
)

Я дошел до извлечения части поля запроса, но застрял при попытке взорвать поля через запятую.Основная проблема связана с подзапросами, в которых тоже могут быть запятые (см. Пример).

Спасибо за любую помощь!

Ответы [ 2 ]

4 голосов
/ 24 августа 2012

Для тех, кто сталкивается с этим вопросом в будущем, кто-то уже сталкивался с проблемой написания парсера SQL на PHP .

В настоящее время он поддерживает операторы SELECT, INSERT, UPDATE, DELETE и REPLACE.

4 голосов
/ 11 февраля 2011

Вам придется написать синтаксический анализатор, почти такой же сложный, как синтаксический анализатор запросов MySQL (написанный на YACC / Bison для C). Это не будет регулярным выражением или небольшим манипулированием строкой. Это нерегулярный язык, вы не можете разобрать их без фактического парсера.

Вы не можете просто пройтись по строке, находя запятые и скобки, SQL намного сложнее. У вас есть выражения в выражениях, вызовы функций, условная логика и т. Д., Которые могут быть произвольно вложены в запятые и круглые скобки.

http://dev.mysql.com/doc/refman/5.0/en/expressions.html

Если вы действительно хотите сделать это с PHP, у вас впереди большая работа.

...