我检查了多个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
)。
注:注意,index
和date
在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)');