PHP PDO错误处理停止执行

PHP PDO错误处理停止执行,php,ajax,pdo,error-handling,Php,Ajax,Pdo,Error Handling,我对PHP非常陌生,来自ASP,很难准确理解PHP和PDO的错误处理工作原理。这就是我要做的 PDO设置为: PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 我正在对PHP页面进行AJAX调用,以处理一些数据并使用PDO将其保存到MySQL。我的DB脚本在一个try-catch中,如下所示: function processStuff(){ try { $sth = $db->prepare( query );

我对PHP非常陌生,来自ASP,很难准确理解PHP和PDO的错误处理工作原理。这就是我要做的

PDO设置为:

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
我正在对PHP页面进行AJAX调用,以处理一些数据并使用PDO将其保存到MySQL。我的DB脚本在一个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,我相信这将继续处理,我如何检测错误以便将其抛出捕获

我确信有一些基本的概念,我只是不了解它是如何工作的。代码很棒,但是任何解释都非常感谢

谢谢

更新: 下面是实际的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处理错误,但它确实停止了挂起。这是正确的处理方法,还是有更好的方法?

这里有几个问题,我将尝试回答所有问题

如果我切换到ERRMODE_SILENT,我相信这将继续处理,我如何检测错误以将其抛出捕获

在这种情况下,您不需要使用try/catch,而是需要一个
if
语句来检查PDO错误代码,例如
if($db->errorCode()!==null)
(请参见PHPDoc),您可以在其中记录错误,或者将

为什么我的AJAX请求在失败后挂起

我怀疑您的页面实际上没有挂起;相反,由于这样或那样的原因,没有执行任何JS。在第一次尝试中,您将得到500个错误代码,这不会触发您为
$.post
提供的
.success()
函数。要查看本例中的问题,您需要添加
.fail()
回调您的AJAX请求

一旦您切换到使用
触发器\u error
,将返回200 OK,因为没有引发异常。我不确定您所说的“我的AJAX错误地处理了它”是什么意思

这是正确的处理方法,还是有更好的方法

这在很大程度上取决于偏好。PDO异常对于我来说应该非常罕见,因为我在将数据发送到数据库之前正在处理和验证数据。在您的情况下,
列“field”不能为null
就是一个很好的例子,您应该事先检查

如果确实发生PDO异常,我会尝试优雅地处理它——这意味着
捕获它,记录错误,将HTTP响应代码设置为合理的值(可能
400错误请求
),并返回带有错误消息的结果。在Javascript中,我有一个
.fail
方法,可以解析错误的结果,并显示适合用户的内容。成功和失败案例有完全不同的方法是一个很好的设计原则,可以帮助避免代码混乱


我希望这能帮助您走上正确的轨道。

处理应该会继续进行,因为您已经捕获了异常。您能显示实际的代码,包括
catch
块中的内容吗?因此您调用的是AJAX页面,而错误发生在AJAX页面中?您的问题是AJAX响应没有向我发回错误消息?在catch中输入一个包含错误消息的返回,然后通过jquery ajax调用“catch”该消息。如果json是失败事件,则显示该消息。即使没有HTTP 200状态码,也肯定会发送ajax(XHR)响应(如果不是,则意味着PHP进程/代码永远不会终止,HTTP通道永远不会关闭,这是值得怀疑的!)。这可以通过查看浏览器工具的“网络”选项卡进行简单验证。请确保也处理
失败
的情况(对于“坏JSON”和/或非200响应)在JavaScript/jQuery/XHR中。当错误发生时,我得到了200个响应。我不确定如何处理失败的情况。感谢Xantien,这为我提供了一个好的开始。一个问题…所以使用沉默的情况下,我会一起摆脱try/catch,并执行如下操作:if($db->errorCode()!==null){trigger_error();}为了记录错误?准确地说。它看起来像“if($sth->errorCode()!==null){trigger_error('PDO!Message:'的意外异常)。print_r($sth->errorInfo()),E_USER_error);}”,尽管我可能更喜欢将它保持在ERRMODE_异常状态,因为异常附带了一个方便的“$ex->getMessage()'它已经有了一个格式很好的错误消息,对于er来说,try/catch更为明确