PDO重复更新错误

时间:2015-10-16 14:56:31

标签: php mysql pdo mariadb

我已经检查了多个PDO帖子,他们都说语法不正确,但即使在检查时我似乎无法找到它。 这是我的代码:

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

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

这是产生的错误:

  

致命错误:未捕获的异常' PDOException' with message' SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MariaDB服务器版本对应的手册,以便在索引,日期,短片附近使用正确的语法VALUES(?,?,?)ON DUPLICATE KEY UPDATE date = VALUES(date)'在第1行' in /comersomers/f/b/e/**************/httpd.www/editagenda.php:14堆栈追踪:#0 / customers / f / b / e / ** ************ / httpd.www / editagenda.php(14):PDO->准备(' INSERT INTO年龄......')#1 {main}第14行/customers/f/b/e/**************/httpd.www/editagenda.php投放

其中14是prepare行。

此行在DBadmin中运行良好。

我的表格如下:

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

1 个答案:

答案 0 :(得分:5)

您不能将一个占位符用于多个值。

来自the manual

  

注意:   参数标记只能表示完整的数据文字。文字,关键字,标识符和任意查询部分都不能使用参数绑定。例如,您不能将多个值绑定到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 )。

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)');