【问题标题】:SQL via PDO and the use of transactions will not execute通过 PDO 的 SQL 和事务的使用不会执行
【发布时间】:2011-07-20 09:01:35
【问题描述】:

我在整个网站中一直使用 PDO;但是,在更新 auditkey 表中的键时,以下(简化方法)将无法在 DB 上成功执行:

 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 对应的手册 正确语法的服务器版本 在附近使用 '键='f6aa38e947482563913c56c2c72a59ea623c7dfb'' 在第 1 行

当手动修改并输入 UPDATE 时,SQL 工作正常:

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

【问题讨论】:

  • 我最近学到的一点是,如果你的脚本中还有一个catch 函数,在你的try 之后,它使用$dbh->rollback(),你必须将beginTransaction 放在你的@ 之外987654327@,否则你的回滚没有回滚的意义。

标签: php transactions pdo


【解决方案1】:

您在问题末尾发布的更新查询与您在准备好的语句中使用的更新查询不等效:在手工查询中,字段名称用反引号括起来.

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


尝试更改您准备好的语句,将 key 字段的名称括在反引号中:

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


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

【讨论】:

  • 谢谢,非常感谢!不完全确定 PDO 在准备数据库端时如何/是否修改了 SQL。我还修改了关于“等效”SQL 的主要帖子。
【解决方案2】:

你在这里忘记了美元符号:

  $beginTransaction($dbh);

Key 是 MySQL 保留的关键字。

【讨论】:

  • 忘了说这是一个包装函数的调用,修改了主帖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多