相關的問題,而不是對我很有幫助:Why cant you pass MYSQL functions into prepared PDO statements?PHP PDO ::準備查詢的建築 - 問題與MySQL功能
這裏的交易:我在寫一個抽象層,PHP PDO和實施查詢生成器。
這個確切的問題只發生在INSERT語句中。以下是我的代碼示例:
$db->insert('table_name')
->keys(array('abc', 'def', 'ghi'))
->values(array($var1, $var2, $var3)) // can take a 2D array if you want to insert multiple rows at the same time
->execute();
底層代碼使用?的值而不是值構建查詢字符串。對於這個特定的例子中,查詢將導致以下情況:
INSERT INTO `table_name`
(`abc`, `def`, `ghi`)
VALUES
(?, ?, ?)
一旦調用,它通過爲一維數組(即具有問號相關聯的所有的值被放入單個陣列)的值,以PDOStatement::execute()
。而這就是問題的開始 - 在PDOStatement::execute()
不處理MySQL的功能本身,而是引用了他們作爲字符串,從而打破了查詢:
INSERT INTO `table_name`
(`abc`, `def`, `ghi`)
VALUES
('123', 456, 'NOW()') -- error, incorrect datetime value: 'NOW()'
的問題是 - 如何使這項工作,同時仍保持相同的界面?我知道我可以檢查列的值是否是一個MySQL函數並直接放入,而不是問號,但是有許多函數可以在那裏使用,並且會吸引人。
編輯:所以現在最簡單的選擇似乎是簡單地將值設置爲像這樣離開:$var3 => 'noquote'
。這不是一個很好的,但它的工作原理。
PDO已經是一種抽象。添加另一個圖層的目標是什麼? –
afaik pdo沒有 - > insert語句,它有 - > query和 - > prepare,所以除非你使用另一個代碼抽象,否則insert()應該什麼也不做。 – Lucas
@Lucas - insert()不是來自PDO,這是我寫的函數,返回一個包含僅與MySQL INSERT語句相關的方法的對象。 update()和select()相同。 – jurchiks