将SQL查询的SELECT子句解析为PHP数组

将SQL查询的SELECT子句解析为PHP数组,php,mysql,arrays,string,explode,Php,Mysql,Arrays,String,Explode,这更适合于在PHP中将查询发送到服务器之前对其进行分析。我这么做的原因很复杂,所以我不想去探究原因 在PHP中,我需要将字段选择存储到PHP数组中。以这个查询为例: SELECT user_id,username,DATE(join_datetime) as join_date, (SELECT COUNT(1) FROM foobar WHERE foonum IN (5,4,6) and user_id = users.user_id) as myfoo_count FROM users

这更适合于在PHP中将查询发送到服务器之前对其进行分析。我这么做的原因很复杂,所以我不想去探究原因

在PHP中,我需要将字段选择存储到PHP数组中。以这个查询为例:

SELECT user_id,username,DATE(join_datetime) as join_date, (SELECT COUNT(1) FROM foobar WHERE foonum IN (5,4,6) and user_id = users.user_id) as myfoo_count 
FROM users 
WHERE user_id = 123
因此,在这种情况下,我需要将user_id、username、DATEjoin_datetime存储为join_date,从foobar中选择COUNT1,其中foonum在5,4,6中,user_id=users.user_id作为myfoo_count,并将其存储到由逗号分解的数组中,。所以我会得到:

array (
  [1] => 'user_id',
  [2] => 'username',
  [3] => 'DATE(join_datetime) as join_date',
  [4] => '(SELECT COUNT(1) FROM foobar WHERE foonum IN (5,4,6) and user_id = users.user_id) as myfoo_count'
)
我已经开始提取查询中的字段部分,但我一直在尝试用逗号分解字段。主要问题是子查询中可能也有逗号,请参见示例


谢谢你的帮助

您必须编写一个与MySQL的查询解析器(用YACC/Bison for C编写)一样复杂的解析器。它不是一个正则表达式或一点字符串操作。这是一种非常规语言,没有实际的解析器就无法解析它们

您也不能只是遍历字符串来查找逗号和括号,SQL要比这复杂得多。表达式、函数调用、条件逻辑等中都有表达式。所有这些表达式都可以用逗号和括号任意嵌套


如果你真的想用PHP实现这一点,那么你将面临一项艰巨的任务。

对于将来遇到这个问题的任何人来说,有人已经费劲地编写了一个


目前它支持SELECT、INSERT、UPDATE、DELETE和REPLACE语句。

好吧,这与它无关。这种情况需要我写一本小说来解释原因。这不是糟糕的设计或懒惰,我只是不想让每个人都对项目的非必需细节感到厌烦。X-Ref:David,任何怀疑PHP中声明性语言解析器有用性的人都不值得争论。注意,我编写了X-Ref中引用的PHP SQL解析器。正如第二个答案中所述,我为PHP编写了一个实际的SQL解析器,因为我需要为切分解析和重新编写SQL。它被称为PHP SQL解析器。该解析器由SugarCRM使用,可以作为Drupal插件等提供。随着Google代码的消亡,PHP SQL解析器源代码现在保存在Github上