Php 找出mysql查询将访问哪些表(预先)

Php 找出mysql查询将访问哪些表(预先),php,mysql,Php,Mysql,我有一个任意的sql查询。从这个查询开始,我想知道这个查询将访问或更改哪些表。可能定义了一些函数或触发器,这些函数或触发器会更改查询中声明的on以外的其他表 我考虑创建一个不同的mysql服务器,将查询发送到该服务器。但是这些表需要事先创建,但是哪一个呢 有什么想法吗?我想这取决于你的想法。如果是像Select*fromxjoiny之类的废话,你可以解析数据并检索表名 $string = "select * from table_name join table_name_2 on table_n

我有一个任意的sql查询。从这个查询开始,我想知道这个查询将访问或更改哪些表。可能定义了一些函数或触发器,这些函数或触发器会更改查询中声明的on以外的其他表

我考虑创建一个不同的mysql服务器,将查询发送到该服务器。但是这些表需要事先创建,但是哪一个呢


有什么想法吗?

我想这取决于你的想法。如果是像Select*fromxjoiny之类的废话,你可以解析数据并检索表名

$string = "select * from table_name join table_name_2 on table_name_2.id = table_name.table_name_2_id join table_name_3 blah blah";
preg_match_all('/(?<=from|join|update )\S+/i', $string, $match);
print_r($match);
您可以在查询上运行,它会显示计划和将要使用的所有表。因此,这将是:

EXPLAIN yourqueryhere

这不是你的目的吗?由于函数和触发器的原因,您无法解析查询。因此,您可以执行事务,找出受影响的表,如果不想提交,则执行回滚。如果确实是任意查询,则需要sql解析器。查看ANTLR?是否需要以下帮助:谢谢您的评论。不幸的是,事务无法正常工作,因为我正在使用MyISAM存储引擎。sql解析器不会通过触发器为我提供已更改的表。但我想这是最好的选择。你需要过滤掉子查询,例如从select中过滤出来……这看起来很有希望。似乎我也必须在那里对派生表进行一些解析,因为我得到了如下结果:id select_type table type。。。1小学所有。。。1主域均衡器参考主。。。2由_domainid_和_day使用临时数据导出;使用filesort,我希望这个表是可读的。这是最简单的方法,您可以获取表列下的所有行,以查看正在使用哪些表。从每个表检索到的记录计数的行数和列数。EXPLAIN主要用于查询优化,但它适合您在这种情况下的需要。当我有一个查询请求来自多个数据库的表时,该数据库不包括在表名中。就像上面由_domainid_和_day编写的一样,它来自统计数据库,我目前在tmp数据库中。你知道如何绕过这个漏洞吗?一个解决这个问题的廉价方法是给表加上别名,在每个表类型后面加上“dbname.tablename”