2015-10-16 88 views
1

我檢查了多個PDO帖子,他們都說這個語法不正確,但即使在檢查時我似乎無法找到它。 這裏是我的代碼:PDO重複更新錯誤

$stmt = $pDatabase->prepare('INSERT INTO Agenda (index, date, shortdesc) VALUES :values ON DUPLICATE KEY UPDATE date=VALUES(date), shortdesc=VALUES(shortdesc)'); 

我試圖在最後一個;修復它,或者在一次插入一個。它準備上的錯誤,所以無論:values應該甚至不重要。

這是產生的誤差:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'index, date, shortdesc) VALUES(?, ?, ?)ON DUPLICATE KEY UPDATE date=VALUES(date)' at line 1' in /customers/f/b/e/**************/httpd.www/editagenda.php:14 Stack trace: #0 /customers/f/b/e/**************/httpd.www/editagenda.php(14): PDO->prepare('INSERT INTO Age...') #1 {main} thrown in /customers/f/b/e/**************/httpd.www/editagenda.php on line 14

其中14是prepare線。

此行在DBadmin中正常工作。

我的表看起來像這樣:

index  date   shortdesc  longdesc   boolean 
10   2015-12-12 Something  copyshort   1 
11   2015-11-12 Somethi2ng  copyshort2   0 
+0

錯誤消息中的SQL與您發佈的SQL不同。 '$ stmt'中沒有'VALUES(?,?,?)'。 – Barmar

回答

5

不能使用一個佔位符,這樣的多個值。

the manual

Note: Parameter markers can represent a complete data literal only. Neither part of literal, nor keyword, nor identifier, nor whatever arbitrary query part can be bound using parameters. For example, you cannot bind multiple values to a single parameter in the IN() clause of an SQL statement.

試試這個:

$stmt = $pDatabase->prepare('INSERT INTO Agenda (index, date, shortdesc) VALUES (:index, :date, :shortdesc) ON DUPLICATE KEY UPDATE date=VALUES(date), shortdesc=VALUES(shortdesc)'); 

(請注意,您所需要的())然後通過三個值,每一個佔位符(:index:date,和:shortdesc)。

P.S.請注意,indexdate在MySQL(和大多數RDBMS)中是reserved words。您需要將它們包裝在揹包中,如下所示:

$stmt = $pDatabase->prepare('INSERT INTO Agenda (`index`, `date`, shortdesc) VALUES (:index, :date, :shortdesc) ON DUPLICATE KEY UPDATE date=VALUES(`date`), shortdesc=VALUES(shortdesc)'); 
+0

那麼..如果我想要根據變量(count)添加可變數量的值,該怎麼辦?我仍然必須做一個循環並不斷添加一個新的(:index,:date,:desc),(:index2,:date2:desc2)等?這完全違背了使用參數標記的目的,也可能直接將它們插入到查詢中,以供我使用它。 –

+0

@JordyBrinks準確。你總是可以創建一個包裝類(例如[裝飾器](https://en.wikipedia.org/wiki/Decorator_pattern))來爲你自動化循環。 –

+0

@JordyBrinks請參閱我上面的修改;我只注意到一個額外的問題,這是造成您的原始錯誤。 –