Php Loggin';尝试捕获事务
我的代码是Php Loggin';尝试捕获事务,php,pdo,transactions,try-catch,Php,Pdo,Transactions,Try Catch,我的代码是 try{ $this->_db->beginTransaction(); $stmt = $this->_db->prepare("..."); $stmt->execute(array($var1, $var2)); ... }
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{}的第一行,这意味着回滚对文件内容没有影响。但是,如果查询处的数据无效,则回滚工作将重新启动它们,并且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");
try..catch块内部没有本质上的不同。您的文件编写代码应该与外部代码的工作方式相同,没有区别
我能想到的唯一问题与try..catch无关,但通常与异常无关:抛出的异常终止进一步的代码执行。比方说,如果
$stmt->rollBack()中有错误代码>-不会执行以下代码。因此,最好将记录器移到块的顶部。您知道,如果某些代码是以“我将某物放在某个地方”的形式编写的,很难说为什么它不起作用。尝试将文件内容放在回滚之上,并在可能的情况下打开错误报告。您只是没有设置正确的错误模式,请参阅此处的“无效数据”部分?你试过什么调试?如果你不知道你的系统是否工作,为什么还要写文件呢?为什么不回显错误呢?您是否引发了异常?在写信给我之前回答这个问题谢谢你的回答。请参阅主要帖子的更新。对我来说还是没有结果。顺便问一下,应该有哪些错误?我尝试使用错误的表名称和值。感谢您的帮助。即使我不需要它,我也知道如何让它发挥作用,这仍然是一个很好的实践。今天我读了很多关于异常的信息。