0

如果 PHP 成功返回,我会处理它,但就错误而言,我对我应该做什么有点困惑。

error:由于以下代码不起作用,我正在考虑做的事情是在我的 PHP 中将邮件函数设置为等于变量以保存函数的结果。然后在我的 jQuery 中,测试变量的结果以确定它是否为真。

然而,这一切都会发生在success:似乎显然应该处理这个错误的情况下。

我如何让它success:正确处理成功并显示一条消息,同时error:通过返回错误来处理错误,然后我将能够将它们显示给用户。

如果你能告诉我我的.html()功能是否做得好,还有加分?它的格式看起来很混乱,但我似乎想不出更好的方法来做到这一点。

jQuery:

// Following section submits form without refreshing page
var dataString = "name=" + nameVal + "&email=" + emailVal + "&message=" + messageVal;  
$.ajax({  
    type: "POST",  
    url: "mail.php",  
    data: dataString,  
    success: function() { 
        $(".contact-form").hide();
        $(".alt-contact").hide();
    // Inserts divs making up the success message for the form submission
        $(".contact-form").html("<div class='success-message'><div class='success-image'></div><div class='success-title'>Success! The message has been sent!</div><div class='success-body'>I'll get back to you right away.</div></div>");
        $(".contact-form").fadeIn(500);
    }
    error: function() {
        $(".contact-form").hide();
        $(".alt-contact").hide();
        // Inserts divs making up the success message for the form submission
        $(".contact-form").html("<div class='error-message'><div class='error-image'></div><div class='error-title'>Success! The message has been sent!</div><div class='error-body'>I'll get back to you right away.</div></div>");
        $(".contact-form").fadeIn(500);
    }
});
return false;

PHP:

<?php

    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];

    $recipient = 'me@christianselig.com';
    $subject = 'Message From Website';
    $body = '<b>From:</b> ' . $name . '\n\n' . $message;
    $headers = 'From: ' . $email . '\r\n';
    $headers .= 'Content-type: text/html; charset=UTF-8' . '\r\n';

    mail($recipient, $subject, $body, $headers);

?>
4

1 回答 1

2

任何错误消息仍将在 ajax 调用中返回“成功”。(错误功能是“呼叫不起作用”或“来自服务器的意外响应”)

您应该检查脚本以向脚本报告成功和错误状态。这在 JSON 中最容易处理,但为此您需要编写一个自定义错误处理程序来输出 JSON。

现在,通过以下方式使其变得简单:

if (@mail($recipient, $subject, $body, $headers)) {
     return json_encode(array('success' => 1));
} else {
     return json_encode(array('success' => 0));
} 

然后将您的 JS 更改为

// Following section submits form without refreshing page
var dataString = "name=" + nameVal + "&email=" + emailVal + "&message=" + messageVal;  
$.ajax({  
    type: "POST",  
    url: "mail.php",  
    data: json,    // CHANGED TYPE HERE
    success: function(data) { 
          if (data.success) {
                // WORKED
           } else {
                // FAILED TO SEND
           }
        $(".contact-form").fadeIn(500);
    }
    error: function() {
           // was not JSON, you got some other error
    }
});
return false;

编辑以回应评论问题

默认情况下error,如果有无效响应(例如 404 页面未找到,500 服务器错误)将被调用。当我添加“数据类型:json”error时,如果无法将响应解析为 JSON,那么也会返回。如果您将数据类型保留为“dataString”,那么您可能无法命中error,因此添加 JSON 类型使其更可靠。无论如何,JSON 在 Javascript 中更容易处理,并且已知结构是最好的 - 所以总是尝试返回 JSON(除非您需要 HTML、XML 或其他已知结构)。字符串最不可靠。

一开始会稍微复杂一些,因为常规的 PHP 错误也会作为“字符串”而不是有效的 JSON 发送回;所以这些去error你必须处理的地方。我在上面的示例中通过在代码中隐藏邮件调用中的错误来避免这种情况@,并专门处理它。对于我的项目,我有自定义错误处理程序,它可以捕获错误并以已知结构返回 JSON 中的响应 - 然后返回success,我所有的 AJAX 调用都检查“data.error”,这意味着它通过了错误处理程序,并且可以进行相应处理。但现在,只需通过errorAJAX 处理并使用 Charles (Mac OS) 或 Fiddler (Windows) 或浏览器中的网络嗅探器进行调试。

于 2012-09-25T00:18:45.427 回答