2012-10-14 132 views
3

我想爲表添加前綴,並且最近編寫了一個PHP腳本來提取字符串SQL查詢中的所有表。從SQL查詢中提取所有表

$sql = 'UPDATE festivals SET desc = "Starts from July"'; 
preg_match_all('/(from|into|update|table|join) (`?\w+`?)\s/i', $sql, $matches); 

它的工作好,但唯一的問題是,它提取July,因爲它沒有一個SQL值和實際表名稱區分,所以它假定July將是一個表了。

現在我認爲解決方案應該是防止提取包含在單引號或雙引號中的內容,但不知道如何做。

+2

你應該真的考慮這個問題:http://stackoverflow.com/questions/281041/regular-expression-to-find-all-table-names-in-a-query。 – nvartolomei

+0

謝謝,但這是另一個問題,因爲我想添加一個前綴到表,並不關心空白,別名或等 – Omid

+0

你試過我建議在下面的正則表達式? –

回答

0

你的正則表達式是關閉這種方式更好:

"/((?:^select .+?(?:from|into))|^update|^table|join) (`?\w+`?)\s/I" 

但我仍然同意nvartolomei。

+0

它沒有任何工作 – Omid

+0

這是你的測試用例的紅寶石味道。你用什麼口味? –

+0

我們可以聊天嗎? – Omid

0

如果你在查詢寫作時更加嚴格,你可以將所有的數據庫,表和列名稱都包含在反引號`中,並且它們將非常容易提取 - 只需在它們之間獲得第一個字符串匹配即可使反引號而不是可選。

這就是說,我不完全知道如何您正則表達式,因爲July是匹配from July後面沒有空格...

+1

是真的,沒有選擇那個。也許他沒有真正測試它,只是提出了一個假設情景。 –

+0

@Kolink使用反引號將是一個好主意,但只是當你是唯一的開發者而不適用於團隊合作時。而關於'七月'這只是一個例子 – Omid

+0

如果你(或你的團隊)不能遵循正確的標準,那麼你不能用正則表達式來處理任務。你會有更多的運氣自己解析查詢並提取表。或者,您可以在查詢的開頭放置'explain',運行它,然後查找查詢摘要中列出的表。 –