2015-10-16 2 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, который вы опубликовали. Нет 'VALUES (?,?,?)' В '$ stmt'. – 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. Обратите внимание: index и date: reserved words в 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)'); 
+0

Итак, что, если у меня было переменное количество значений, которые я хотел добавить на основе переменной (count)? мне все равно придется сделать цикл и продолжать добавлять новый (: index,: date,: desc), (: index2,: date2: desc2) и т. д.? Это полностью нарушает цель использования маркера параметра, может также вставлять их непосредственно в запрос, для чего я его использую. –

+0

@JordyBrinks Точно. Вы всегда можете создать класс-оболочку (например, [decorator] (https://en.wikipedia.org/wiki/Decorator_pattern)), чтобы автоматизировать цикл для вас. –

+0

@JordyBrinks Пожалуйста, смотрите мое редактирование выше; Я просто заметил дополнительную проблему, которая вызывает исходную ошибку. –