代码之家  ›  专栏  ›  技术社区  ›  Paulo

regex在mysql查询中的每个表前插入一个字符串

  •  0
  • Paulo  · 技术社区  · 16 年前

    我需要一个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 回复  |  直到 16 年前
        1
  •  3
  •   Paolo Bergantino    16 年前

    我们在这里谈论的代码库有多大?像这样的一个正则表达式是严重地与灾难调情,我认为你最好寻找每一个 mysql_query 或者你的代码中的任何东西,你自己进行修改。这不应该超过一个小时,你将花在实现你的regex和修复所有边缘案件,它无疑会错过。

        2
  •  2
  •   DGM    16 年前

    使用regex重写代码会有问题。

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

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

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

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

        3
  •  0
  •   MarkusQ    16 年前

    首先,正则表达式本身并不能胜任这项任务。考虑如下事项:

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

    要真正做到这一点,您需要一些东西来解析SQL,生成一个可以修改的分析树,然后从修改后的分析树中发出修改后的SQL。这样做是可行的,但不可取(因为保罗给出的理由)。

    更好的方法是通过源代码进行grep,查找表名、用于发送SQL的函数、单词来源或脚本中类似的内容,以便在这些地方将您放入编辑器。