在查询中获取mysql表

时间:2010-08-03 14:35:50

标签: php mysql count

有什么方法可以获取我在查询中使用的表格吗?

我使用的第一种方法是使用正则表达式:

// 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

您没有获得查询中使用的表,因为使用了任何表,您将获得“选择优化的表”。

那么,还有另一种方法来获取查询中使用的表

2 个答案:

答案 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变得更容易。 :-)你能编辑你的疑问吗?