Invizz
Новичок
preg_replace, сохранение результатов, обратная замена
Eсть система. Возникла необходимость изменить ее до определеннного порядка. Для этого, нужно сделать несколько preg_replace'ов для запросов. И не обсуждается по многим причинам, могу даже сказать по каким.
Эти реплейсы выглядят примерно так:
Как видите, он ищет по слова WHERE JOIN FROM итд.
Если в названии колонки или таблицы (к примеру), встретится слово where, например запрос будет иметь вид
select * from table left join table_where where
то он "схавает" where тот который неслужебный. а так не надо.
Тут можно сказать, так сделай типа, поиск с пробелами и чувствительным к регистру! А нет, а допустим если запрос:
INSERT INTO posts(id,content) VALUES('','А я тут сегодня начился пользоваться \) скобками, \' кавычками VALUE WHERE INTO ');
и в переменном тексте могут содержаться ненужные слова.
Поэтому было принято решение сначала все в
озможные переменные данные "экстрактнуть" из запроса, сделать изменения и данные воткнуть обратно.
Возьмем к примеру, простенький,
SELECT link_id,link_order,link_category from `links` order by link_id
Нужно все имена колонок выдрать так, чтобы осталось:
SELECT var1,var2,var3 FROM `links` order by var1
Потом выполняются действия над запросами.
А потом var1,var2,var3 заменяются на link_id,link_order,link_category обратно.
Как заменить-то, я понимаю, а вот как сохранить результаты и заменить обратно?
Извините, что так длинно получилось, и может путанно, но вот как то так.
Eсть система. Возникла необходимость изменить ее до определеннного порядка. Для этого, нужно сделать несколько preg_replace'ов для запросов. И не обсуждается по многим причинам, могу даже сказать по каким.
Эти реплейсы выглядят примерно так:
PHP:
$query=preg_replace( '@SELECT\s{1,}(DISTINCT){0,1}\s{1,}(.*?)FROM\s{1,}(\S+)(.*?)JOIN(.*?)WHERE(.*?)\s(LIMIT|ORDER|GROUP)@s',
'SELECT \1 \2 FROM \3 \4 JOIN \5 WHERE \3.blog_id='.$this->blog_id.' AND ( \6 ) \7',
$query);
Если в названии колонки или таблицы (к примеру), встретится слово where, например запрос будет иметь вид
select * from table left join table_where where
то он "схавает" where тот который неслужебный. а так не надо.
Тут можно сказать, так сделай типа, поиск с пробелами и чувствительным к регистру! А нет, а допустим если запрос:
INSERT INTO posts(id,content) VALUES('','А я тут сегодня начился пользоваться \) скобками, \' кавычками VALUE WHERE INTO ');
и в переменном тексте могут содержаться ненужные слова.
Поэтому было принято решение сначала все в
озможные переменные данные "экстрактнуть" из запроса, сделать изменения и данные воткнуть обратно.
Возьмем к примеру, простенький,
SELECT link_id,link_order,link_category from `links` order by link_id
Нужно все имена колонок выдрать так, чтобы осталось:
SELECT var1,var2,var3 FROM `links` order by var1
Потом выполняются действия над запросами.
А потом var1,var2,var3 заменяются на link_id,link_order,link_category обратно.
Как заменить-то, я понимаю, а вот как сохранить результаты и заменить обратно?
Извините, что так длинно получилось, и может путанно, но вот как то так.
я решил сделать немного по другому в итоге.