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);
    }
  }

最初のクエリは実行されますが、2 番目のクエリは実行されません。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);
}

申し訳ありませんが、最初に正しいコードを投稿していませんでした。コードを簡素化するために foreach を除外しました

于 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 に答える