Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RegEx在MySQL查询中的每个表之前插入一个字符串_Mysql_Regex - Fatal编程技术网

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

RegEx在MySQL查询中的每个表之前插入一个字符串,mysql,regex,Mysql,Regex,我需要进行一个MySQL查询,并在每个表名之前插入一个字符串。解决方案不需要是一行,但显然这是一个正则表达式问题。它将在PHP中实现,因此具有编程逻辑也很好 理由和背景: 我正在修改我的代码库,以允许使用表前缀(例如:“nx_用户”而不是“用户”),我希望有一个功能可以为我自动执行,这样我就不需要查找每个查询并手动修改它 例如: SELECT * FROM users, teams WHERE users.team_id = teams.team_id ORDER BY users.last_n

我需要进行一个MySQL查询,并在每个表名之前插入一个字符串。解决方案不需要是一行,但显然这是一个正则表达式问题。它将在PHP中实现,因此具有编程逻辑也很好

理由和背景: 我正在修改我的代码库,以允许使用表前缀(例如:“nx_用户”而不是“用户”),我希望有一个功能可以为我自动执行,这样我就不需要查找每个查询并手动修改它

例如:

SELECT * FROM users, teams WHERE users.team_id = teams.team_id ORDER BY users.last_name
使用前缀“nx_3;”,它应更改为

SELECT * FROM nx_users, nx_ teams WHERE nx_ users.team_id = nx_ teams.team_id ORDER BY nx_ users.last_name
显然,它应该处理其他情况,例如表别名、联接和其他常见的MySQL命令


有人这样做过吗?

我们在这里谈论的代码库有多大?类似这样的正则表达式会带来严重的灾难,我认为您最好自己查找代码中的每一个
mysql\u查询
或任何内容并进行更改。它不应该花费超过一个小时的时间来实现您的正则表达式并修复所有它无疑会错过的边缘情况。

我们在这里讨论的代码库有多大?类似这样的正则表达式会带来严重的灾难,我认为您最好自己查找代码中的每一个
mysql\u查询
或任何内容并进行更改。实现正则表达式和修复它无疑会错过的所有边缘情况所花费的时间不应该超过一个小时。

首先,单靠正则表达式无法完成这项任务。考虑这样的事情:

select sender from email where subject like "from users group by email" 
要真正做到这一点,您需要一些能够解析SQL的东西,生成一个可以修改的解析树,然后从修改过的解析树发出修改过的SQL。这样做是可行的,但不可取(因为保罗给出的理由)


更好的方法是在源代码中搜索表名、用于发送SQL的函数、来自的单词或类似的内容,以便在这些点将您放入编辑器。

首先,仅正则表达式无法完成此任务。考虑这样的事情:

select sender from email where subject like "from users group by email" 
要真正做到这一点,您需要一些能够解析SQL的东西,生成一个可以修改的解析树,然后从修改过的解析树发出修改过的SQL。这样做是可行的,但不可取(因为保罗给出的理由)


更好的方法是在源代码中搜索表名、用于发送SQL的函数、来自的单词或类似的东西,以便在这些点上将您放入编辑器。

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

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

$query = "SELECT foo from " . $table_prefix . "bar WHERE 1";
如果将其封装在一个类中,那就更好了


本例没有考虑任何转义或安全问题。

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

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

$query = "SELECT foo from " . $table_prefix . "bar WHERE 1";
如果将其封装在一个类中,那就更好了


这个例子没有考虑任何逃逸或安全问题。

我通常会同意,但它实际上是一个在发生时运行的解决方案。它是web应用程序的一部分,其他开发人员也将为其编写。如果我能可靠地使用它,从长远来看对我来说会更好。您无法可靠地使用它,尤其是对于没有解析SQL能力的正则表达式。有些语言/平台可以使用适当的SQL解析器,但即使在那时,这仍然是一个危险的提议。我通常会同意,但它实际上是一个可以随情况运行的解决方案。它是web应用程序的一部分,其他开发人员也将为其编写。如果我能可靠地使用它,从长远来看对我来说会更好。您无法可靠地使用它,尤其是对于没有解析SQL能力的正则表达式。对于某些语言/平台,有合适的SQL解析器可用,但即便如此,这仍然是一个危险的提议。