登录'尝试捕获事务

时间:2013-06-20 11:43:33

标签: php pdo transactions try-catch

我的代码是

                try{
                $this->_db->beginTransaction();
                $stmt = $this->_db->prepare("...");
                $stmt->execute(array($var1, $var2));
                                    ...

            } catch (Exception $e) {
              $stmt->rollBack();
            }

我想使用函数

将此操作记录到我的日志文件中

如您所见,这意味着在事务中保存错误。另一个也应该保存成功的尝试。但是如果我把它们放在try {}中并且捕捉{}它们由于某种原因它们不起作用。在外面它确实工作正常,但我不确定我应该在这里检查true / false以查看try / catch之外的结果。

感谢您的回答。我只是在学习,所以我的问题可能是愚蠢的。非常遗憾。 =)

更新。

我试图做的是:

try{...
} catch (Exception $e) {
$stmt->rollBack();
file_put_contents(LOG_CONST, date("r")." UderID: ".$id." Error: ".$e->getMessage()."\n", FILE_APPEND);            
}

它没有放任何东西。


更新2

不确定我是否必须在此处添加新的详细信息,或者我应该自己回答......无论如何。现在我正在尝试这段代码

try{
$this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $this->_db->beginTransaction();
    $stmt = $this->_db->prepare

         ..................

    $stmt->execute(array($var));
        file_put_contents(DATACHANGE_LOG, date("r")." ".n307." UderID: ".$id."\n", FILE_APPEND);
    $this->_db->commit();

} catch (Exception $e) {
        file_put_contents(DATACHANGE_LOG, date("r")." Hello! \n", FILE_APPEND);
        $stmt->rollBack();
}

我的日志文件中的有效数据和无效数据的结果相同。这是try {}的第一行,这意味着回滚在file_put_contents中不是有效的。但是,如果查询无效回滚的数据再次运行,并且DB没有更改。但回滚之前的行永远不会有效。

错误已启用,但它没有显示任何内容......我只是不能放弃我必须理解它...


更新3

什么是无效数据? 我试过MySQL错误/表,行错误。 为什么我需要这个呢? 我正在学习并做很多事情,实际上我不需要了解它是如何工作的。正如我现在看到的那样,它在MySQL本身中抛出了错误,所以在这种特殊情况下真正没用的记录器。无论如何,我有我的错误,就在这里。

工作代码:

                try{
                $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $this->_db->beginTransaction();
                $stmt = $this->_db->prepare

                                     QUERIES

                $stmt->execute(array($var));
                file_put_contents(DATACHANGE_LOG, date("r")." ".n307." UserID: ".$id."\n", FILE_APPEND);
                $this->_db->commit();
            }catch(PDOException $e){
                file_put_contents(DATACHANGE_LOG, date("r")."Error". $e->getMessage()."  UserID: ".$id."\n", FILE_APPEND);
                if($this->_db->rollback())
                    header("Location: http://link");
            }
            header("Location: http://anotherlink");

1 个答案:

答案 0 :(得分:0)

try..catch块内部没有什么本质区别。而你的文件编写代码应该和外面一样工作,没有区别。

我能想到的唯一问题是try..catch与一般的异常无关:抛出的异常会终止进一步的代码执行。比如说,如果$stmt->rollBack();中有错误,则不会执行以下代码。因此,最好将记录器移动到块的顶部。

相关问题