Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите, пожалуйста, написать выражение для проверки SQL-запроса
Форумы портала PHP.SU » PHP » Регулярные выражения » Помогите, пожалуйста, написать выражение для проверки SQL-запроса

Страниц (1): [1]
 

1. combatlynx - 12 Апреля, 2016 - 17:40:54 - перейти к сообщению
Физический смысл: если в запросе, приведенном ниже, идет обращение к таблице, отличной от SD, то нужно забраковать такой запрос.
select sd.id, (select sum(val) from SD where id=1) - (select sum(val) from SD where id=2) res
from SD, SD a, (select * from SD) ab, SD b left join (SD c join SD d on c.id=d.up) e on e.t=b.t
where (select max(id) from SD where id=a.up)=0 and sd.id=a.up and a.t=ab.id and b.up=a.t
order by sd.id, sd.up

Попытался описать своими словами последовательность поиска:
1) from или join
2.1) любое количество пробельных символов и скобок, затем слово не SD до следующего вхождения SELECT, ORDER, GROUP, JOIN
2.2) или любой текст или символы до первой "," до следующего вхождения SELECT, ORDER, GROUP, JOIN, после которой идет любое количество пробельных символов и скобок, затем слово не SD
2. combatlynx - 18 Апреля, 2016 - 12:50:53 - перейти к сообщению
Написал такое вот выражение:

CODE (htmlphp):
скопировать код в буфер обмена
  1. (from|join)[\s(]*([\s(])\b(?!sd\b)|from[^,]*([\s(]*,[\s(]*\b(sd\b)|[\s(]*,[\s(]*\b(sd[\s]*[\w]*\b))*[\s(]*,[\s(]*\b(?!sd\b|select\b)


Натравливаю на запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT sd.id, res1 (SELECT sum(val) FROM   SD WHERE id=1) - (SELECT sum(val) FROM SD WHERE id=2) res
  2. FROM SD, SD фф, sd 'sfg', sdf, (SELECT AS, cb FROM SD, sd, sdf) ab,     SD b LEFT JOIN (SD c JOIN SD d ON c.id=d.up) e ON e.t=b.t
  3. WHERE (SELECT max(id) FROM SD WHERE id=a.up)=0 AND sd.id=a.up AND a.t=ab.id AND b.up=a.t
  4. ORDER BY sd.id, sd.up
  5.  

Осталось решить две проблемы: кириллические буквы в именах таблиц и упоминание алиасов в апострофах/кавычках (см. скриншот): фрагменты "SD фф, sd 'sfg'" не дает обнаружить идущий за ним недопустимый "sdf"
[img]https://yadi.sk/i/x3WMjEmZr5pjQ[/img]
3. Vitaly - 18 Апреля, 2016 - 14:36:13 - перейти к сообщению
combatlynx, попробуйте следующее выражение
CODE (htmlphp):
скопировать код в буфер обмена
  1. (from|join)[\s(]*([\s(])\b(?!sd\b)|from[^,]*([\s(]*,[\s(]*\b(sd\b)|[\s(]*,[\s(]*\b(sd[\s]*'?\w*\b'?))*[\s(]*,[\s(]*\b(?!sd\b|select\b)

А чтобы "палить" кириллические буквы использйте модификатор для юникода /u:

PHP:
скопировать код в буфер обмена
  1. $re = "/(from|join)[\\s(]*([\\s(])\\b(?!sd\\b)|from[^,]*([\\s(]*,[\\s(]*\\b(sd\\b)|[\\s(]*,[\\s(]*\\b(sd[\\s]*'?\\w*\\b'?))*[\\s(]*,[\\s(]*\\b(?!sd\\b|select\\b)/iu";
  2. $str = "..<<select>>.."
  3. preg_match_all($re, $str, $matches);



Ах, про кавычки то и забыл. Тогда вот так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. (from|join)[\s(]*([\s(])\b(?!sd\b)|from[^,]*([\s(]*,[\s(]*\b(sd\b)|[\s(]*,[\s(]*\b(sd[\s]*(?<quotGrp>['"]?)\w*\b(?P=quotGrp)))*[\s(]*,[\s(]*\b(?!sd\b|select\b)


PHP:
скопировать код в буфер обмена
  1. $re = "/(from|join)[\\s(]*([\\s(])\\b(?!sd\\b)|from[^,]*([\\s(]*,[\\s(]*\\b(sd\\b)|[\\s(]*,[\\s(]*\\b(sd[\\s]*(?<quotGrp>['\"]?)\\w*\\b(?P=quotGrp)))*[\\s(]*,[\\s(]*\\b(?!sd\\b|select\\b)/iu";
  2. $str = "..<<select>>.."
  3. preg_match_all($re, $str, $matches);


Подмигивание
4. Folod - 20 Апреля, 2016 - 23:25:12 - перейти к сообщению
спасибо, тот же вопрос интересовал !

 

Powered by ExBB FM 1.0 RC1