是否有一个用 PHP 编写的轻量级 sql 解析器类可以做到这一点?

sky*_*gle 6 php sql postgresql

在我自己动手之前,我想我应该先在这里问一下。

我希望对随机 SQL 命令进行一些基本解析,以便:

  1. 检查“SELECT”中使用的字段名称(包括任何子查询)
  2. 检查“JOIN”中使用的字段名称(包括任何子查询)
  3. 检查查询中使用的表的名称(包括任何子查询)

我见过一些 SQL 解析器类,但它们对于上述用例来说太“重量级”了。

有人知道至少具有一些所需功能的轻量级类吗?

最坏的情况,如果我必须编写一个解析器,那么编写这样一个解析器的最佳方法是什么(通常,要编写一个解析器,我通常会使用 PHP 中不可用的工具),关于如何编写解析器的任何提示编写一个“粗略且准备就绪”的类来进行此解析?

//rough sketch
<?php
class SqlParser()
{
    protected $sqlstr;
    protected $m_tablenames = array();
    protected $m_fieldnames = array();

    public function __construct($sql){
       $this->sqlstr = $sqlcmd;
       $this->parseString($sqlstr);
    }

    public function __destroy(){}
    public function getTableNames(){ return m_tablenames; }
    public function getFieldNames(){ return m_fieldnames; }

    private function parseString($sql)
    {
        //TODO
    }
}

?>
Run Code Online (Sandbox Code Playgroud)

我希望解析尽可能与 SQL 方言无关(即不依赖于任何特定的 SQL 方言或数据库特定的 SQL)。

如果这是不可能的,那么我将使用的 SQL 方言是 PostgreSQL。

jmz*_*jmz 2

PHP SQL 解析器可能就是您正在寻找的。正如您从链接中看到的,它将处理相当复杂的查询。从项目首页下载代码。唯一的缺点是它仅针对 MySQL。添加对 PostgreSQL 的支持应该不是什么大问题。

还有一个更基本的 SQL 解析解决方案:PHP SQL Tokenizer,但它除了 select/from/where/order 分离之外什么都不提供:没有字段名称、子查询提取等。