1

我有这个代码:

    $this->db->beginTransaction();
    $query = 'INSERT INTO `table1` VALUES (NULL,:a,:b,NULL,NOW())';
    $sth = $this->db->prepare($query);
    foreach ($values as $k => $v) {
      $sth->bindParam(':' . $k, $v, PDO::PARAM_INT);
    }

    $this->executeQueryRollbackOnException($sth, 'Message_1');
    $resetId = $this->db->lastInsertId();

    $query = 'UPDATE `table2` SET c=:c,d=:d WHERE reset_id IS NULL';
    $sth = $this->db->prepare($query);
    foreach ($values2 as $k => $v) {
      $sth->bindParam(':' . $k, $v, PDO::PARAM_INT);
    }


    $this->executeQueryRollbackOnException($sth, 'Message_2');

    Zend_Debug::dump($sth->rowCount(), 'Affected'); // This is 0

    // Commit
    $this->db->commit();    

...

  private function executeQueryRollbackOnException($sth, $message) {
    try {
      $sth->execute();
    } catch (Exception $e) {
      $this->logSQLError($e);
      $this->db->rollBack();
      throw new Exception($message);
    }
  }

第一个查询已执行,但第二个未执行。没有产生mysql错误。有任何想法吗 ?

4

2 回答 2

1

我找到了解决方案。

foreach ($values as $k => $v) {
   $sth->bindParam(':' . $k, $v, PDO::PARAM_INT);
}

应该

foreach ($values as $k => $v) {
   $sth->bindParam(':' . $k, $values[$k], PDO::PARAM_INT);
}

对不起,我第一次没有发布正确的代码,我排除了 foreaches 以简化代码

于 2012-04-10T11:55:25.953 回答
0

为 0的事实$sth->rowCount()并不意味着查询未运行。如果您的 PHP 错误日志中没有报告错误,则查询运行良好。如果行数为 0,则表示没有更新任何行。这很可能是由于您的条件不匹配任何行。

运行以下;如果你得到 0,那么你知道问题是你的UPDATE条件:

SELECT COUNT(*) FROM `table2` WHERE reset_id IS NULL
于 2012-04-10T11:57:58.227 回答