SQL через PDO и использование транзакций не будет выполняться - PullRequest
1 голос
/ 22 марта 2011

Я использую PDO по всему сайту;однако когда дело доходит до обновления ключа в таблице audkey, следующее (упрощенный метод) не будет успешно выполнено в БД:

 try {
      $dbh = new PDO(etc...);
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      $currentKey = getCurrentKey(); //returns a SHA1 key
      beginTransaction($dbh); // not a typo, call to a wrapper function!
      $stmt = $dbh->prepare("UPDATE auditkey SET key=:nextKey");
      $stmt->bindValue(':nextKey', sha1($currentKey), PDO::PARAM_STR);
      $success = $stmt->execute();
      $dbh->commit();
    }

Я получаю следующую ошибку:

SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1064 В синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'key =' f6aa38e947482563913c56c2c72a59ea623c7dfb '' в строке 1

Когда UPDATE изменяется и вводится вручную, SQL работает нормально:

UPDATE `auditkey` SET `key`='f6aa38e947482563913c56c2c72a59ea623c7dfb';

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Запрос на обновление, который вы разместили в конце вашего вопроса, не эквивалентен тому, который вы использовали в подготовленном утверждении: в ручном запросе имена полей заключаются в обратные галочки.

Это не должно сильно измениться для поля auditkey; но оно должно сильно измениться для поля key, так как key является зарезервированным словом .


Попробуйте изменить подготовленный оператор, чтобы заключить имя поля key в кавычки:

$stmt = $dbh->prepare("UPDATE auditkey SET `key`=:nextKey");


Для справки приведем список зарезервированных слов для MySQL.

0 голосов
/ 22 марта 2011

Вы забыли доларский символ здесь:

  $beginTransaction($dbh);

Ключ - это зарезервированное ключевое слово от MySQL.

...