mysql 枚举表_枚举mysql查询中使用的表?

bd96500e110b49cbb3cd949968f18be7.png

Is there any way to enumerate tables used in mysql query?

Lets say I have query :

SELECT * FROM db_people.people_facts pf

INNER JOIN db_system.connections sm ON sm.source_id = pf.object_id

INNER JOIN db_people.people p ON sm.target_id = p.object_id

ORDER BY pf.object_id DESC

And I want in return array:

$tables = array(

[0] => 'db_people.people_facts',

[1] => 'db_system.connections',

[2] => 'db_people.people',

);

解决方案

The solution marked as good will return only the result tables. But if you do the next query it will fail:

SELECT users.* FROM users, cats, dogs WHERE users.id = cats.user_id

Will return only users and not cats and dogs tables.

The best solution is find a good parser, another solution is using REGEX and EXPLAIN query (more info in the next link):

But I think that another good solution is list all tables and search them inside the query, you can cache the list of tables.

EDIT: When searching for tables, better use a preg like:

// (`|'|"| )table_name(\1|$)

if(preg_match('/(`|\'|"| )table_name(\1|$)/i', $query))

// found

If not, it can return false positives with for example "table_name2", "table_name3"... table_name will return FOUND two times.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值