2012-07-24 40 views
4

我有一個函數,它接受一個數組並根據數組的鍵/值對創建一條SQL語句。例如:查找字符串是否爲PHP中的MySQL函數

name=>SomeKittens 

它會變成

(`name`) VALUES ('SomeKittens') 

唯一的問題是,當我使用MySQL字符串函數如NOW()

creation_date=>NOW() 

變成

(`creation_date`) VALUES ('NOW()') 

注意NOW()被轉義。有什麼辦法可以檢測出這個值是否是一個MySQL字符串函數? (當然,除了$value === "NOW()"

我使用的是Joomla DBO,但也開放給PDO/MySQLi解決方案。

relevant chat discussion

+0

NOW()不會被轉義,但它是一個文字字符串。 – PeeHaa 2012-07-24 18:55:03

+4

你如何區分'NOW()'是一個函數,'NOW()'是一個硬編碼的5字符文字串?您可能需要在鍵/值對中手動提供更多元數據以指示如何解釋該值,例如'name => STRING:SomeKittens'和'creation_date => FUNC:NOW()' – mellamokb 2012-07-24 18:55:22

回答

4

如果你允許帶參數的函數,我認爲你不能保護你的數據庫免受SQL注入。
如果你只允許不帶參數的函數(比如NOW()),你也可以硬編碼一個列表。

1

你可能只是想定義就像MYSQL_NOW是創建查詢時,你知道轉換爲NOW()函數調用,而不是「NOW()」字符串常量。