在进入并推动我自己之前,我想我先在这里问.
>检查’SELECT’中使用的字段名称(包括任何子查询)
>检查’JOIN’中使用的字段名称(包括任何子查询)
>检查查询中使用的表的名称(包括任何子查询)
我已经看到了一些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
}
}
?>
我希望尽可能地将解析与sql方言无关(即不依赖于任何特定的sql方言或数据库特定的sql).
如果那是不可能的,那么我将使用的sql方言是Postgresql.
解决方法:
PHP SQL Parser可能就是你要找的东西.正如您可以从链接中看到的那样,它将处理相当复杂的查询.从项目首页下载代码.唯一的缺点是它只针对MysqL.添加对Postgresql的支持应该不是什么大问题.
还有一个更基本的sql解析解决方案:PHP SQL Tokenizer,但除了select / from / where / order separation之外,它不提供任何东西:没有字段名,子查询提取等.