有什么方法可以获取我在查询中使用的表格吗?
我使用的第一种方法是使用正则表达式:
// result[1] = "SELECT"
// result[3] = "All between FROM and WHERE, ex: `users`, ex: `users`, `test`
if($result[1] == "SELECT" && !preg_match('/FROM\s*(.*?,.*?)\s*WHERE/i', $query, $res))
{
$tables = preg_replace('/`|\'|\s/i', '', $result[3]); // strip ` or ' or spaces
$tables = explode(",", $tables);
sort($tables);
}
但是有复杂的mysql查询,所以我使用的下一个方法是:
EXPLAIN SELECT...
并从结果数组中获取表。
问题来自于计数,我知道在MyISAM数据库的存储的行数,所以如果你进行下一个查询:
SELECT COUNT(*) FROM users
您没有获得查询中使用的表,因为使用了任何表,您将获得“选择优化的表”。
那么,还有另一种方法来获取查询中使用的表?
答案 0 :(得分:1)
我正在做的是使用两种方法。
private function get_tables($query)
{
$res = preg_match('/^(SELECT|UPDATE|INSERT|DELETE)(.+?FROM| INTO)?\\s*`?(.+?)($|`| |\\()/i', $query, $result);
if(!$res)
return false;
$tmp_tables = array();
// Get array tables using EXPLAIN
if($result[1] == "SELECT")
$tmp_tables = $this->get_select_query_tables($query);
// Get array tables using REGEX
if($result[1] == "SELECT" && !preg_match('/FROM\s*(.*?,.*?)\s*WHERE/i', $query, $res))
{
$tables = preg_replace('/`|\'|\s/i', '', $result[3]);
$tables = explode(",", $tables);
sort($tables);
$tmp = $tables;
// Check if all REGEX tables are in EXPLAIN tables, if not, add the missed
foreach($tmp as $tmp_table)
if(!in_array($tmp_table, $tmp_tables))
$tmp_tables[] = $tmp_table;
}
return $tmp_tables;
}
答案 1 :(得分:1)
如果你每次提到表时都用数据库名称明确地为表添加前缀,那么它将使你的RegEx变得更容易。 :-)你能编辑你的疑问吗?