【发布时间】:2015-06-01 00:25:17
【问题描述】:
我是来自 ASP 的 PHP 新手,我很难理解错误处理是如何与 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,我相信它会继续处理,我如何检测错误以便将其抛出?
我确信有一些基本概念我只是不了解它是如何工作的。代码很棒,但任何解释都非常感谢。
谢谢。
更新: 这是实际的 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 处理不正确,但它确实停止了挂起。这是处理这个问题的正确方法,还是有更好的方法?
【问题讨论】:
-
处理应该继续正常,因为您已经捕获了异常。你能显示实际的代码,包括
catch块中的内容吗? -
所以你在调用一个AJAX页面,而这个错误是在ajax页面中发生的?您的问题是 AJAX 响应没有发回错误消息?在您的 catch 中放置一个包含错误消息的返回值,然后使用 jquery ajax 调用“捕获”它。如果 json 是失败事件,则显示消息。
-
一个 AJAX (XHR) 响应肯定 正在发送,即使没有 HTTP 200 状态代码(如果没有,则意味着 PHP 进程/代码永远不会终止并且 HTTP 通道永远不会关闭,这是值得怀疑的!)。这可以通过查看浏览器工具的“网络”选项卡简单验证。确保也在 JavaScript/jQuery/XHR 中处理
failing 情况(用于“错误 JSON”和/或非 200 响应)。 -
发生错误时我收到 200 响应。我不确定如何处理失败的情况。
标签: php ajax pdo error-handling