Парсинг sql запросв

young

Новичок
Demiurg
В силу некоторых вещей, мне пришлось писать парсинг самому.
Это оказалось около 200-250 строк кода.

Как тебе такое:

insert into a (b) values ('a" insert into c (d) values (\'new "insert "\')" ');

:)
 

Blindman

Новичок
Demiurg
insert into `mytab` (name, city) VALUES ('[r_name]', '[cit]');
запросы чем будут друг от друга отличаться? именем таблицы? количеством выбираемых полей ? чем-то еще ?
больше ничем, только имя таблицы и кол-во полей, поля формы будут в [поле]
в чем трудность?
 

Demiurg

Guest
>в чем трудность?
трудности в том, что в значениях могут быть и скобки и кавычки и все, что угодно.
 

Blindman

Новичок
>в чем трудность?
трудности в том, что в значениях могут быть и скобки и кавычки и все, что угодно.
Значением является имя поля формы, заключенное в квадратные скобки. Кавычек, скобок и т.п. оно содержать не будет
 

Falc

Новичок
Demiurg
Дело в том что написать парсер под конкретный генератор sql'я и универсальный парсер это разные задачи.


young
>>insert into a (b) values ('a" insert into c (d) values (\'new "insert "\')" ');

легко парсится 2-мя строчками:

preg_match( '~insert into (\S*) \((.*?)\) values \((.*)\)~i', $test, $out );
preg_match_all( '~\'.*?(?<!\\\\)\'~i', $out[3], $out2 );

Возможно есть ошибки или неточности, но они легко устраняются.
 

Demiurg

Guest
Falc
в том то и дело, что не так легко
insert into a (b) values ('\\');

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

IMW

Guest
young
>>insert into a (b) values ('a" insert into c (d) values (\'new "insert "\')" ');

легко парсится 2-мя строчками:

preg_match( '~insert into (\S*) \((.*?)\) values \((.*)\)~i', $test, $out );
preg_match_all( '~\'.*?(?<!\\\\)\'~i', $out[3], $out2 );

Возможно есть ошибки или неточности, но они легко устраняются. [/B][/QUOTE]
Пробовал для своего примера ничего не получается.
 

IMW

Guest
Originally posted by Falc
IMW
Твой пример парсится этими регами.
Парсит нормально, просто он еще и пробелы внутри считает, но под свой запрос я уже подгоню, кавычки и скобки обрежу уже сам тоже. Большое всем спасибо!!!!!!!!!!
 

Falc

Новичок
IMW
Названия полей я не парсил подумал что с этим справится даже начинающий. Значения он парсин нормально без пробелов и кавычек.
 

IMW

Guest
Originally posted by Falc
IMW
Названия полей я не парсил подумал что с этим справится даже начинающий. Значения он парсин нормально без пробелов и кавычек.
$test="insert into `mytab` (name, city) VALUES '[r_name]', '[city]'); "; - такую парсит
$test=" insert into `mytab` (name, city) VALUES ('[r_name]', '[cit]'); "; такую нет. Между (into `mytab`) разное кол-во пробелов. но себе я уже все подогнал еще раз сенкс
 

Falc

Новичок
IMW
>>$test=" insert into `mytab` (name, city) VALUES ('[r_name]', '[cit]'); "; такую нет.

У меня парсит :)
 

IMW

Guest
Originally posted by Falc
IMW
>>$test=" insert into `mytab` (name, city) VALUES ('[r_name]', '[cit]'); "; такую нет.

У меня парсит :)
странно, да ладно

-~{}~ 10.02.04 19:09:

Парсит если меняешь кол-во пробелов между (into `mytab`),
а разве должно?
 

Falc

Новичок
IMW
не вижу ничего страного он и должен ее парсить, страно что у тебя не парсит :)
 

IMW

Guest
Originally posted by Falc
IMW
не вижу ничего страного он и должен ее парсить, страно что у тебя не парсит :)
у меня парсит если пробелов одинаково, а так как запрос генерится по одному шаблону то подстроить preg труда не составляет
 

Falc

Новичок
IMW
>>Парсит если меняешь кол-во пробелов между (into `mytab`),

Ну это уже особенность твоего генератора, хотя тут добавить универсальность не составит труда.
 

IMW

Guest
Originally posted by Falc
IMW
>>Парсит если меняешь кол-во пробелов между (into `mytab`),

Ну это уже особенность твоего генератора, хотя тут добавить универсальность не составит труда.
preg_match( '~insert into \s+ (\S*) \((.*?)\) values \((.*)\)~i', $test, $out );
так что ли?
 
Сверху