2011-03-22 63 views
1

我一直在我的网站使用PDO;然而,当涉及到更新的auditkey表,下面(简化方法)一键将不会对数据库成功执行:通过PDO SQL和使用交易将不会执行

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语法中有一个 错误;检查 的手册,当更新修订,并手动输入第1行

对应于你的MySQL 服务器版本正确的语法 利用近 “键=” f6aa38e947482563913c56c2c72a59ea623c7dfb' ,在SQL作品精细:

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

最近我学到了一些东西,如果你的脚本中还有一个'catch'函数,在'try'后面使用'$ dbh-> rollback()',你必须将'beginTransaction'放在你的'尝试',否则你的回滚没有一点回滚到。 – TheCarver 2013-09-15 11:56:09

回答

1

你张贴在你的问题的最后更新查询不等同到你在准备好的声明中使用的一个:在手工制作的查询,字段名称包含在反引号中。

对于字段,这应该不会有太大变化;但它应该在key字段中有很大变化,因为key是保留字


试着改变你事先准备好的声明中,反引号包围key字段的名称:

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


作为参考,这里是Reserved words MySQL的列表。

+0

谢谢,非常感谢!并不确定PDO在准备数据库端时如何修改SQL。我还修改了关于“等效”SQL的主要帖子。 – Sonak 2011-03-22 12:46:43

+0

不客气:-)玩得开心! – 2011-03-22 13:12:07

0

你忘了这里DOLAR符号:

$beginTransaction($dbh); 

主要是由MySQL保留关键字。

+0

忘了提及它是对包装函数的调用,修改过的主要帖子 – Sonak 2011-03-22 12:42:59