Parse a cláusula SELECT das consultas SQL em uma matriz PHP

Isso é mais para analisar uma consulta em PHP ANTES de ser enviada para o servidor. Muito complicado por que estou fazendo isso, então eu prefiro não entrar no motivo para isso.

Em PHP, preciso armazenar as seleções de campo em uma matriz de php. Então, pegue esta consulta, por exemplo:

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 

Então, neste caso, eu preciso armazenar “user_id, nome de usuário, DATE (join_datetime) como join_date, (SELECT COUNT (1) FROM foobar WHERE foonum IN (5,4,6) e user_id = users.user_id) como myfoo_count” para uma matriz explodida por uma vírgula (,). Então eu obtive:

 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' ) 

Eu cheguei até a extração dos campos parte da consulta, mas estou preso a tentar explodir os campos por vírgula. O principal problema é que as subconsultas podem ter vírgulas neles também (veja o exemplo).

Obrigado por qualquer ajuda!

Você precisaria escrever um analisador quase tão complexo quanto o analisador de consulta do MySQL (escrito em YACC / Bison para C). Não vai ser uma expressão regular ou uma pequena manipulação de cordas. Esta é uma linguagem não regular, você não pode analisá-los sem um analisador real.

Você não pode apenas percorrer a cadeia encontrando vírgulas e parênteses, o SQL é muito mais complexo do que isso. Você tem expressões dentro de expressões, chamadas de function, lógica condicional, etc., tudo isso pode ser nested arbitrariamente profundamente com vírgulas e parênteses por toda parte.

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

Se você realmente quer fazer isso com o PHP, você tem um grande trabalho antes de você.

Para qualquer um que tenha abordado esta questão no futuro, alguém já teve problemas para escrever um analisador de SQL em PHP .

Atualmente suporta instruções SELECT, INSERT, UPDATE, DELETE e REPLACE.