一尘不染

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

mysql

这更多地用于在PHP发送到服务器之前分析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,用户名,DATE(join_datetime)存储为join_date,(从foobar WHERE
foonum IN(5,4,6)和user_id =
users.user_id)中选择COUNT(1)作为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'
)

我已经达到了提取查询的字段部分的目的,但是我一直想尝试用逗号爆炸字段。主要问题在于子查询中也可能包含逗号(请参见示例)。

谢谢你的帮助!


阅读 369

收藏
2020-05-17

共1个答案

一尘不染

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

您也不能单单查找包含逗号和括号的字符串,SQL比这复杂得多。您可以在表达式,函数调用,条件逻辑等中包含表达式。所有这些表达式都可以使用嵌套在逗号和括号内的任意深度。

http://dev.mysql.com/doc/refman/5.0/en/expressions.html

如果您真的想用PHP做到这一点,那么您就需要做很多工作。

2020-05-17