0

我知道以前有人问过这个问题,并且我查看了所有可以找到的与此相关的帖子。我仍然无法让 jQuery.post 函数正确接收来自 php 脚本的错误。两者都有。
PHP:

<?php 
##CONFIGURATION
# LIST EMAIL ADDRESS
$toemail = "email here";

# SUBJECT (Subscribe/Remove)
$subject = "Someone has contacted International Designs";

# RESULT PAGE
$location = "../thank-you.php";

## FORM VALUES ##
$myname = $_REQUEST['myname'];
$myemail = $_REQUEST['myemail'];
$mymessage = $_REQUEST['mymessage'];

if ( empty($myname) || empty($myemail) || empty($mymessage) ) {

    exit('{"error":"That value was invalid!"}')

} else {

    # SENDER
    $email = $myname . " <" . $myemail . ">";

    # MAIL BODY
    $body .= "Name: " . $myname . " \n\n";
    $body .= "Email: " . $myemail . " \n\n";
    $body .= "Message: " . $mymessage . " \n\n";
    # add more fields here if required

    ## SEND MESSGAE ##

    mail( $toemail, $subject, $body, "From: $email" ) or die ("Mail could not be sent.");

}

?>

JS:

if (verify(myname, myemail, mymessage, human, hash, patt)) {
  $.post(myform.attr('action'), myform.serialize(), function() {
    $('#email-success').fadeIn();
    myform[0].reset();
    setTimeout("$('#email-success').fadeOut();", 5000);
  }, 'json')
  .fail(function() {
    alert('An error has occurred. Please try again later.')
  });
}

我已经尝试了大约 5 种不同的方法,但都没有奏效。当我将“json”作为 .post 函数中的数据类型时,无论 php 脚本中有什么内容,都会触发 .fail。如果我不考虑数据类型,那么 .fail在任何情况下都不会触发。我感觉问题出在 php 命令和数据类型上。任何帮助表示赞赏。

4

3 回答 3

2

可能是因为您没有更改响应的 http 标头代码,也没有指定您的数据类型响应。

在任何情况下,您都是对前端(jQuery)代码的 php 代码响应,状态为“200 – OK”,但在某些情况下,您期望出现错误,并出现“HTTP/1.0 400 – Bad Request”响应或“HTTP/1.0” 500内部服务器错误'。

而且,就像说茄子一样,您必须将响应数据类型指定为“Content-Type: application/json”。

所以,最终的代码是这样的:

<?php 
...

header('HTTP/1.0 204 – No Content', true, 204);
header('Content-Type: application/json');

if ( empty($myname) || empty($myemail) || empty($mymessage) ) {

    header('HTTP/1.0 400 – Bad Request', true, 400);
    exit('{"error":"That value was invalid!"}')

} else {

    ...

    $send = mail( $toemail, $subject, $body, "From: $email" );
    if (!$send)
        header('HTTP/1.0 500 – Internal Server Error', true, 500);
        exit ('{"error":"Mail could not be sent."}');
    }
}
return;
?>

对于警告,您可以在同一问题上Cannot modify header information - headers already sent by (output started at /homepages/.../design/contact.php:1)检查此答案。

输出可以是:

  • 无意:
    • 之前的空格
    • UTF-8 字节顺序标记
    • 以前的错误消息或通知
  • 故意的:
    • print、echo 和其他产生输出的函数(如 var_dump)
    • 之前的原始区域

聊天会话后更新:这是一个 UTF-8 BOM 问题

于 2013-05-17T08:04:38.183 回答
0

虽然,您的数据是有效的 JSON 数据,但我始终建议使用 json_encode() 函数来创建 JSON 字符串。

exit(json_encode(array("error" => "That value was invalid!")));

另一个是确保您发送正确的标头以确保脚本知道它的 json 数据。所以

header('Content-Type: application/json');
exit(json_encode("error" => "That value was invalid!"));
于 2013-05-17T08:09:51.337 回答
0

尝试这个

if (verify(myname, myemail, mymessage, human, hash, patt)) {
    $.ajax({
        type    :'POST',
        data    :$("#myformid").serialize(),
        beforeSend:function(){

        },
        success:function(res){
            if(res=='ok'){
                setTimeout("$('#email-success').fadeOut();", 5000);
            }else{
                //read respon from server
                alert(res)
            }
        },
        error:function(){
            //error handler
        }
    });
}

只是例子

$send = mail(....);//your mail function here
echo ($send) ? "ok" : "Error";
于 2013-05-17T08:13:47.883 回答