Я думаю, что схожу с ума от этого ...
Я перепробовал много комбинаций и не могу получить хорошую.
Мне нужно найтивсе запросы SQL в коде PHP после прочтения его с помощью file_get_contents()
.
Конечно, все эти запросы являются переменными, например:
$sql1 = "
SELECT *
FROM users u
WHERE u.name LIKE '%".$name."%' AND ... ;
";
или
$sql2 = "
SELECT *
FROM users u
WHERE u.id = ".$user_id;
или
$sql3 = '
SELECT *
FROM users u
ORDER BY u.surname1 DESC
'; //this query blablabla.......
Итак, вы можете видеть, что есть много факторов, которые нужно учитывать для переменных PHP.
Сначала я попробовал приближение, основанное на получении переменнойсамо по себе в сочетании с получением его содержимого ...
Я также пытался найти конкретные слова из SQL в шаблоне регулярных выражений ...
Что угодно ...
Я не знаю, как это сделать.
Получение всей переменной и ее присваивания, группировка присваивания и после него, циклический поиск совпадений в поисках специальных слов SQL (вот что яМы сейчас, но это не работает, причина присваивает регулярное выражение).
Прямой поискдля запросов SQL с хорошим регулярным выражением?
Переменные PHP (в частности, строки), содержит частичные конкатенации с другими переменными, строки в двойных и одинарных кавычках, комментарии в конце ";"или в середине ...
Так что же я могу сделать?
Пока что это моя переменная часть регулярного выражения:
$regex_variable = '\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*[\+\-\*\/\%\.\&\|\^\<\>]*=\s*';
, которую я объединяю с $ regex_sql, которыйЯ пробовал разные формы:
//$regex_sql = '(["\'])(.*?)\2\s*;';
//$regex_sql = '(["\'])([^;]*?)\2\s*;';
//$regex_sql = '(?<!")\b\w+\b|(?<=")\b[^"]+';
//$regex_sql = '([^;]+)(?<=["\']);(?!["\'])';
//$regex_sql = '(.*?;)[^\\$]*';
Ни одна из этих корректно не работает.
Можете ли вы помочь мне, пожалуйста?Я уверен, что в лучшем приближении он получает все переменные, а после этого проверяет назначение на наличие специальных SQL-слов, таких как SELECT, WHERE, UNION, ORDER, ...
Заранее большое спасибо!
Mark.
edit:
Конечно, переменные с запросами могут иметь любую форму.Вышеприведенные примеры являются простыми примерами.
Мы говорим о таких вещах:
$s = 'insert into tabletest(a,b,c) values('asd','r32r32','fdfdf')';
или
$where = 'where a=2';
$sql="select distinct * from test ".$where;
или
$a = '
select *
from users
left outer join ...
inner join ...
left join ...
where ...
group by ...
having ...
order by ...
limit ...
...
';
или
...
Представьте себе множество программистов, создающих запросы внутри кода, которые делают это по-своему ...: \
У меня естьчтобы получить ВСЕ из них.По крайней мере, максимизируйте результаты ... ^^ '