RegEx для вставки строки перед каждой таблицей в запросе MySQL - PullRequest
0 голосов
/ 31 марта 2009

Мне нужно взять запрос MySQL и вставить строку перед каждым именем таблицы. Решение не должно быть одной строкой, но, очевидно, это проблема регулярных выражений. Он будет реализован на PHP, поэтому и логика программирования тоже подойдет.

Обоснование и история вопроса: Я обновляю свою кодовую базу, чтобы учесть префиксы таблиц (например, 'nx_users' вместо 'users'), и я хотел бы иметь функцию, которая автоматизирует это для меня, поэтому мне не нужно находить каждый запрос и измените его вручную.

Пример:

SELECT * FROM users, teams WHERE users.team_id = teams.team_id ORDER BY users.last_name

Используя префикс 'nx_', он должен измениться на

SELECT * FROM nx_users, nx_ teams WHERE nx_ users.team_id = nx_ teams.team_id ORDER BY nx_ users.last_name

Очевидно, что он должен обрабатывать другие случаи, такие как псевдонимы таблиц, объединения и другие распространенные команды MySQL.

Кто-нибудь делал это?

Ответы [ 3 ]

3 голосов
/ 31 марта 2009

Насколько велика база кода, о которой мы здесь говорим? Регулярное выражение для чего-то подобного серьезно заигрывает с катастрофой, и я думаю, что вам, вероятно, лучше искать каждый mysql_query или что-то в вашем коде и вносить изменения самостоятельно. Это не должно занять больше, чем час, который вы потратили бы на реализацию своего регулярного выражения и исправление всех крайних случаев, которые он, несомненно, упустит.

2 голосов
/ 31 марта 2009

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

Если вам нужно динамически изменить эту строку, то вам нужно разделить свою логику sql в одном месте и иметь переменную $ table_prefix, которая соответствующим образом помещается в каждый запрос sql. Затем переменная может быть установлена ​​вызывающим кодом.

$query = "SELECT foo from " . $table_prefix . "bar WHERE 1";

Если вы инкапсулируете это в классе, тем лучше.

В этом примере не учитываются какие-либо побеги или проблемы безопасности.

0 голосов
/ 31 марта 2009

Во-первых, одни только регулярные выражения не соответствуют задаче. Рассмотрим такие вещи, как:

select sender from email where subject like "from users group by email" 

Чтобы действительно сделать это, вам нужно что-то, что будет анализировать SQL, создавать дерево разбора, которое вы можете изменить, а затем генерировать измененный SQL из модифицированного дерева разбора. При этом это выполнимо, но не рекомендуется (по причинам, указанным Паоло).

Лучшим подходом было бы поискать в источнике либо имена таблиц, либо функцию, которую вы используете для отправки SQL, слово или что-то вроде этого в скрипте, чтобы бросить вас в редактор в этих местах. 1006 *

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