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サーバーエラーなど)がある場合に呼び出されます。「datatype:json」を追加errorしたので、応答をJSONとして解析できない場合にも返されます。データ型を「dataString」のままにした場合、ヒットしない可能性があるerrorため、JSON型を追加すると信頼性が向上します。とにかく、JSONはJavascriptで処理する方が簡単で、既知の構造が最適です。したがって、常にJSONを返すようにしてください(HTML、XML、または別の既知の構造が必要な場合を除く)。文字列の信頼性は最も低くなります。

通常のPHPエラーも有効なJSONではなく「文字列」として返送されるため、最初は少し複雑です。だからこれらerrorはあなたがそれを処理しなければならないところに行きます。上記の例では、コード内のメール呼び出しからエラーを非表示にすることでこれを回避し、@具体的に処理しました。私のプロジェクトでは、エラーをトラップし、既知の構造でJSONの応答を返すカスタムエラーハンドラーがあります。これによりsuccess、すべてのAJAX呼び出しで「data.error」がチェックされます。これは、エラーハンドラーを通過したことを意味します。それに応じて処理されます。ただし、現時点でerrorは、AJAXでを処理し、Charles(Mac OS)またはFiddler(Windows)、あるいはブラウザのネットワークスニファを使用してデバッグします。

于 2012-09-25T00:18:45.427 に答える