2011-02-11 48 views
2

這更多用於在PHP發送到服務器之前分析PHP中的查詢。爲什麼要這樣做非常複雜,所以我寧願不去理由。將SQL查詢的SELECT子句解析爲一個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的SELECT COUNT(1)其中foonum IN(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' 
) 

我已經儘可能提取查詢的領域得到了一部分,但被困在試圖通過逗號爆炸等領域的IM。主要的問題是子查詢中可能有逗號(參見示例)。

感謝您的幫助!

+1

那麼,它與此無關。這是一個需要我解釋原因的小說。它不是糟糕的設計或懶惰,我只是不想讓每個人都對這個項目的不足細節感到厭煩。 – David 2011-02-11 12:33:38

+1

X-Ref:[PHP中的SQL解析器?](http://stackoverflow.com/q/8970499/367456) – hakre 2013-07-09 08:01:13

回答

3

您將不得不編寫一個與MySQL的查詢解析器(寫在YACC/Bison for C)中一樣複雜的解析器。這不會是一個正則表達式或一個小字符串操作。這是一種非正規語言,如果沒有實際的解析器,你就無法解析它們。

你不能只是遍歷查找逗號和括號的字符串,SQL要比這複雜得多。在表達式,函數調用,條件邏輯等中有表達式,所有這些表達式都可以用逗號和括號任意深度嵌套。

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

如果你真的想用PHP來做到這一點,你有一個很大的工作提前自己。

3

對於任何人在未來遇到這個問題,有人已經寫了SQL parser in PHP的麻煩。

目前它支持SELECT,INSERT,UPDATE,DELETE和REPLACE語句。