RegEx在MySQL查询中的每个表之前插入一个字符串

时间:2009-03-31 02:32:57

标签: mysql regex

我需要进行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 个答案:

答案 0 :(得分:3)

我们在这里讨论的代码库有多大?这样的事情的正则表达式正在严重地与灾难调情,我认为你最好在代码中查找每个mysql_query或其他任何内容并自己进行更改。它不应该花费超过您实施正则表达式所花费的时间并修复它无疑会错过的所有边缘情况。

答案 1 :(得分:2)

使用正则表达式重写代码会有问题。

如果需要动态更改此字符串,则需要将sql逻辑分离到一个位置,并在每个sql查询中放置一个$ table_prefix变量。然后可以通过调用代码设置变量。

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

如果你将它封装在一个类中,那就更好了。

此示例未考虑任何转义或安全问题。

答案 2 :(得分:0)

首先,单独的正则表达式不适用于任务。考虑以下事项:

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

要真正做到这一点,你需要能解析SQL的东西,生成一个可以修改的解析树,然后从修改后的解析树中发出修改过的SQL。有了它,它是可行的,但不可取(因为Paolo给出的原因)。

更好的方法是在源代码中查找表名,用于发送SQL的函数,单词from或脚本中的类似内容,以便将您引入这些点的编辑器。 / p>