我是PHP的新手,来自ASP,我很难理解错误处理如何与PHP和PDO一起使用。这是我发生的事情......
PDO设置为:
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
我正在对PHP页面进行AJAX调用以处理一些数据并使用PDO将其保存到MySQL。我把我的数据库脚本放在try catch中:
function processStuff(){
try {
$sth = $db->prepare( query );
$sth->execute();
} catch (PDOEXCEPTION $e){
//log error
}
//if no error
return array(some json);
}
让我们说一些不好的事情发生,我得到一个错误:
Error: exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'field' cannot be null' in C:\filepath:202
正在发生的错误是暂停脚本,从而导致调用页面挂起。 AJAX正在等待JSON响应,它将告诉它是成功还是失败。但由于它悬而未决,因此无法获得响应,因此我没有机会向用户显示错误。
我还有一个自定义错误处理函数:
function errorHandler($errno, $errstr, $errfile, $errline) {
//log errors
}
set_error_handler("errorHandler")
可以记录错误。但是,由于我的新手,我不知道如何在try / catch中使用它。
所以我的问题是,如何在发生PDO异常时记录错误,并确保脚本继续处理,以便使用AJAX的调用页面不会挂起。
围绕类似问题的所有其他答案都假设我似乎还没有一定程度的知识。我不清楚我是否应该抛出一个错误被捕获,或者它是否被自动抛出。如果PDO自动抛出它,我如何在catch中调用我的错误处理程序?我会使用:
errorHandler();
如果我切换到ERRMODE_SILENT,我相信会继续处理,如何检测错误以便将其抛给catch?
我确信有一些基本概念,我只是不了解它是如何工作的。代码很棒,但是非常感谢任何解释。
感谢。
更新: 这是实际的try块:
try {
$sth = $dbh->prepare ("INSERT INTO email_validation (email, val_code) VALUES (:a1, :a2)");
$sth->bindParam (":a1", $email);
$sth->bindParam (":a2", $gencode);
$sth->execute ();
} catch (PDOEXCEPTION $e) {
$err = true;
$errmsg = date("F j, Y, g:i a") . "\n" . ERR_URL . "\n" . $e . "\n\n";
error_log($errmsg,3,ERR_LOG_PATH_INT);
}
AJAX看起来像这样:
$.post('Functions/AJAX-new-account.php', $('form').serialize(), function(data) {
var c = data.check;
if(c==1){
//process client side stuff here
}else{
//----Ooops there was an error-----//
//show error to client
};
return false;
},"json");
我想JSON正在写,但我不明白为什么我没有出现在我的AJAX中的} else {页面似乎停滞不前。
另一个更新:所以我只是尝试了
trigger_error("blah blah");
在catch区块中它停止了。 errorHandler似乎已经正确处理了错误,虽然我的AJAX处理不正确,但它确实停止了。这是处理这个问题的正确方法,还是有更好的方法?
答案 0 :(得分:3)
你在这里有几个问题,我会尝试全部回答。
如果我切换到ERRMODE_SILENT,我相信会继续处理,如何检测错误以便将其抛给catch?
在这种情况下,您不需要使用try / catch,而是需要if
语句来检查PDO错误代码,例如: if ($db->errorCode() !== null)
(请参阅PHPDoc for PDO Error Handling)您可以在其中记录错误,或者将HTTP Response Code设置为您希望从Javascript中获得的内容。
为什么我的AJAX请求会在此失败后挂起?
我怀疑你的页面实际上并没有挂起;相反,没有JS出于某种原因被执行。在您第一次尝试时,您将获得500错误代码,这不会触发您提供给.success()
的{{1}}功能。为了在这种情况下查看问题,您需要在AJAX请求中添加$.post
回调。
交换使用.fail()
后,将返回200 OK,因为没有抛出任何异常。我不确定你是什么意思"我的AJAX处理不正确"。
这是处理此问题的正确方法,还是有更好的方法?
这很大程度上取决于偏好。我的PDO例外应该非常罕见,因为我在将数据发送到数据库之前处理和验证数据。在您的情况下,trigger_error
是您应事先检查的一个很好的例子。
如果确实发生了PDO异常,我会尝试优雅地处理它 - 这意味着Column 'field' cannot be null
,记录错误,将HTTP响应代码设置为合理的(可能catch
会做的事情),并返回带有错误消息的结果。在Javascript中,我有一个400 Bad Request
方法可以解析结果中的错误并显示适合用户的内容。对于成功和失败案例采用完全独立的方法是一个很好的设计原则,可以帮助保持代码的混乱。
我希望这可以帮助你走上正轨。