2012-11-22 55 views
1

相關的問題,而不是對我很有幫助: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'。這不是一個很好的,但它的工作原理。

+0

PDO已經是一種抽象。添加另一個圖層的目標是什麼? –

+0

afaik pdo沒有 - > insert語句,它有 - > query和 - > prepare,所以除非你使用另一個代碼抽象,否則insert()應該什麼也不做。 – Lucas

+0

@Lucas - insert()不是來自PDO,這是我寫的函數,返回一個包含僅與MySQL INSERT語句相關的方法的對象。 update()和select()相同。 – jurchiks

回答

1

添加另一個參數爲方法:

  • 表名
  • 值(如關聯數組)
  • SQL(如關聯數組)

請記住,你不能使用'?'當你想要訪問列時, G。在COLUMN1 + 1COLUMN1 + COLUMN2

1

我PROCEDE那樣:

$bdd->prepare(INSERT INTO `table_name` (`abc`, `def`, `ghi`) VALUES (?, ?, ?)) 
$bdd->execute(array('abcValue', 'devValue', 'ghiValue')) 
+0

這不是用戶所要求的而且根本不工作。 – eisberg

+0

它會工作,如果我只插入一行(不能自動多行這種方式),它需要我手動指定col1/col2是變量和col3是一個MySQL函數。所以是的,並沒有真正的幫助。 – jurchiks

0

你的最後一個查詢想出了一個錯誤(-- error, incorrect datetime value: 'NOW()') 嘗試格式化你的約會對象喜歡這個:

DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s'))

+0

錯誤,它是這樣說的,因爲該值是一個帶引號的字符串,並且MySQL函數必須不加引號。 I.E.它必須是'INSERT INTO .. VALUES('abc',NOW())',而不是'INSERT INTO .. VALUES('abc','NOW()')'。 – jurchiks