考虑下面这三条mysql语句:
select * from Users;
select id, title, value from Blogs;
select id, feelURL, feelTitle from Feeds where id = 1; 现在我不太擅长REGEX,但是我想从mysql查询中获得表名。有没有人可以给我做一个小小的解释。
谢谢,
发布于 2010-03-18 17:11:18
尝试:
preg_match('/\bfrom\b\s*(\w+)/i',$query,$matches)如果查询有1个以上的表,这将不起作用。
基本上,正则表达式在查询中搜索完整的单词FROM,并选择下面的单词作为表名。
发布于 2011-02-21 23:50:50
您实际上可以使用MySQL作为解析器,并在查询中获得表名,无论您的SQL语法有多复杂。
(很抱歉,这是对您的问题的延迟回复-我今天刚刚遇到了同样的问题,并找到了这个解决方案。)
只需在查询前加上单词EXPLAIN,返回到PHP的结果集将包括id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra。第三列是查询中每个表的名称。
例如,如果您的查询是:
select count(*) from ey_def left join ey_rels on def_id=item_id;使用:
explain select count(*) from ey_def left join ey_rels on def_id=item_id;然后MySQL会把这个返回给PHP:
+----+-------------+---------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | ey_def | index | NULL | PRIMARY | 4 | NULL | 87 | Using index |
| 1 | SIMPLE | ey_rels | ALL | NULL | NULL | NULL | NULL | 123 | |
+----+-------------+---------+-------+---------------+---------+---------+------+------+-------------+现在您可以像处理任何其他查询一样简单地处理结果。
发布于 2010-03-18 17:11:56
一个简单的实现是这样的:
preg_match("/\s+from\s+`?([a-z\d_]+)`?/i", $query, $match);
echo $query . " => " . $match[1] . "\n";当您的选择字段列表中有一个子查询时(可能在其他几种情况下),此将中断。或者当您的表名在a-z、数字和下划线旁边包含字符时。
正确解析SQL并非易事。
https://stackoverflow.com/questions/2468497
复制相似问题