PDO重复更新错误


PDO on duplicate update error

我检查了多个PDO帖子,他们都说语法不正确,但即使检查我似乎也找不到它。下面是我的代码:

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

我试过在最后用;修复它,或者一次插入一个。它在准备时出错,所以无论:values是什么都不重要。

这是产生的错误:

致命错误:未捕获异常'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064你的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以便在"索引,日期,shortdesc"附近使用正确的语法。, ?, ?)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} throw 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

你不能像那样用一个占位符来表示多个值。

从手册:

注意:参数标记只能表示完整的数据文字。文字的任何部分、关键字、标识符或任何任意查询部分都不能使用参数绑定。例如,不能将多个值绑定到SQL语句的in()子句中的单个参数。

试试这个:

$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)。

注:注意,indexdate在MySQL(和大多数rdbms)中是保留字。你需要把它们包在背包里,如:

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