PHP PDO错误处理暂停执行

时间:2015-03-27 15:43:41

标签: php ajax pdo error-handling

我是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处理不正确,但它确实停止了。这是处理这个问题的正确方法,还是有更好的方法?

1 个答案:

答案 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方法可以解析结果中的错误并显示适合用户的内容。对于成功和失败案例采用完全独立的方法是一个很好的设计原则,可以帮助保持代码的混乱。

我希望这可以帮助你走上正轨。