2012-03-27 2 views
1

Я использую следующий код:Что случилось с моим синтаксисом PDO/MySQL?

$query = $dbh->prepare("INSERT into crm_order_errors " 
         ."SET (order_id, number_of_attempts, last_attempt) " 
         ."VALUES (:order_id, 0, :last_attempt) " 
         ."ON DUPLICATE KEY UPDATE number_of_attempts = number_of_attempts + 1, last_attempt = :last_attempt" 
     ); 

$query->execute(array(':order_id'=>$orderId, ':last_attempt'=>1332849904); 

Это производит следующее сообщение об ошибке:

PHP Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(order_id, number_of_attempts, last_attempt) VALUES ('10297', 0, '' at line 1 in /_myClasses/MYSQL_Logger.php on line 57

Это просто не ясно мне, где ошибка. Похоже, что значение для :last_attempt не найдено, так как предупреждение помещает его значение в '': Values ('10297', 0, ''. Почему это происходит и является ли источником проблемы?

Кроме того, мне разрешено использовать один и тот же заполнитель дважды в подготовленном заявлении (в данном случае, :last_attempt).

ответ

4

Вам не хватает конечной скобки на вашей функции execute.

Должно быть:

$query->execute(array(':order_id'=>$orderId, ':last_attempt'=>1332849904)); 

И вам нужно удалить SET ключевое слово. Это за UPDATE заявлениями, а не INSERT заявлениями.

+0

Спасибо, это было ключевое слово SET. Пропущенная скобка была просто ошибкой копирования и вставки. – maxedison

0

Вы пропускаете скобку:

$query->execute(array('order_id' => $orderId, 'last_attempt' => 1332849904)); 

удалить Также SET из вашего INSERT INTO заявления.

Смежные вопросы