0

我的代码是

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

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

我想使用函数将此操作记录到我的日志文件中

如您所见,这是为了保存交易中的错误。另一个也应该保存成功的尝试。但是,如果我将它们放在 try{} 中并 catch{} 它们由于某种原因无法正常工作。在外面它确实工作得很好,但我不确定我应该在这里检查什么是真/假以查看 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 处无效。但是,如果查询中的数据无效,则回滚对它们起作用并且数据库中没有更改。但是回滚之前的行永远不会起作用。

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


更新 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");
4

1 回答 1

0

try..catch 块内部没有本质上的不同。而且您的文件编写代码应该与外部相同,没有区别。

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

于 2013-06-20T13:35:18.830 回答