web-dev-qa-db-ja.com

PHPを使用してJQuery .ajax()の適切な成功/エラーメッセージを返すにはどうすればよいですか?

エラーアラートが引き続き表示されます。 MYSQL部分に何も問題はありません。クエリが実行され、dbで電子メールアドレスを確認できます。

クライアント側:

<script type="text/javascript">
  $(function() {
    $("form#subsribe_form").submit(function() {
      var email = $("#email").val();

      $.ajax({
        url: "subscribe.php",
        type: "POST",
        data: {email: email},
        dataType: "json",
        success: function() {
          alert("Thank you for subscribing!");
        },
        error: function() {
          alert("There was an error. Try again please!");
        }
      });
      return false;
    });
  });
</script>

サーバー側:

<?php 
$user="username";
$password="password";
$database="database";

mysql_connect(localhost,$user,$password);
mysql_select_db($database) or die( "Unable to select database");

$senderEmail = isset( $_POST['email'] ) ? preg_replace( "/[^\.\-\_\@a-zA-Z0-9]/", "", $_POST['email'] ) : "";

if($senderEmail != "")
    $query = "INSERT INTO participants(col1 , col2) VALUES (CURDATE(),'".$senderEmail."')";
mysql_query($query);
mysql_close();

$response_array['status'] = 'success';    

echo json_encode($response_array);
?>
70
Pieter

JSON dataTypeを使用している場合は、適切なコンテンツタイプを提供する必要があります。 JSONをエコーする前に、正しいヘッダーを挿入します。

<?php    
    header('Content-type: application/json');
    echo json_encode($response_array);
?>

追加の修正、クエリが成功するかどうかを確認する必要があります。

if(mysql_query($query)){
    $response_array['status'] = 'success';  
}else {
    $response_array['status'] = 'error';  
}

クライアント側で:

success: function(data) {
    if(data.status == 'success'){
        alert("Thank you for subscribing!");
    }else if(data.status == 'error'){
        alert("Error on query!");
    }
},

それが役に立てば幸い。

120
Muhammad Abrar

ご存知のとおり、これをデバッグに使用できます。とても助かりました

error:function(x,e) {
    if (x.status==0) {
        alert('You are offline!!\n Please Check Your Network.');
    } else if(x.status==404) {
        alert('Requested URL not found.');
    } else if(x.status==500) {
        alert('Internel Server Error.');
    } else if(e=='parsererror') {
        alert('Error.\nParsing JSON Request failed.');
    } else if(e=='timeout'){
        alert('Request Time out.');
    } else {
        alert('Unknow Error.\n'+x.responseText);
    }
}
31
Alex

HTTPステータスコードの使用を推奨する人もいますが、私はむしろその習慣を軽spしています。例えば検索エンジンを使用していて、提供されたキーワードに結果がない場合、404エラーを返すことをお勧めします。

しかし、私はそれが間違っていると考えています。 HTTPステータスコードは、実際のブラウザ<->サーバー接続に適用されます。接続に関するすべてが完璧に行きました。ブラウザーが要求を出し、サーバーがハンドラースクリプトを呼び出しました。スクリプトは「行なし」を返しました。その中に「404ページが見つかりません」という意味はありません-ページが見つかりました。

代わりに、サーバー側の操作のステータスからHTTPレイヤーを切り離すことを好みます。 JSON文字列でテキストを返すのではなく、リクエストステータスとリクエスト結果をカプセル化したJSONデータ構造を常に返します。

例えばPHPにあります

$results = array(
   'error' => false,
   'error_msg' => 'Everything A-OK',
   'data' => array(....results of request here ...)
);
echo json_encode($results);

次に、クライアント側のコードで

if (!data.error) {
   ... got data, do something with it ...
} else {
   ... invoke error handler ...
}
21
Marc B

AJAX Webサービスを構築するには、2つのファイルが必要です。

  • JQuery AJAXを使用してPOST(GETの場合もある)としてデータを送信するJavascriptの呼び出し
  • JSONオブジェクトを返すPHP Webサービス(これは、配列または大量のデータを返すのに便利です)

そのため、最初に、JavaScriptファイルでこのJQuery構文を使用してWebサービスを呼び出します。

$.ajax({
     url : 'mywebservice.php',
     type : 'POST',
     data : 'records_to_export=' + selected_ids, // On fait passer nos variables, exactement comme en GET, au script more_com.php
     dataType : 'json',
     success: function (data) {
          alert("The file is "+data.fichierZIP);
     },
     error: function(data) {
          //console.log(data);
          var responseText=JSON.parse(data.responseText);
          alert("Error(s) while building the Zip file:\n"+responseText.messages);
     }
});

PHPファイル(AJAX呼び出しで記述されたmywebservice.php)には、正しい成功またはエラーステータスを返すために、最後に次のようなものを含める必要があります。

<?php
    //...
    //I am processing the data that the calling Javascript just ordered (it is in the $_POST). In this example (details not shown), I built a Zip file and have its filename in variable "$filename"
    //$errors is a string that may contain an error message while preparing the Zip file
    //In the end, I check if there has been an error, and if so, I return an error object
    //...

    if ($errors==''){
        //if there is no error, the header is normal, and you return your JSON object to the calling JavaScript
        header('Content-Type: application/json; charset=UTF-8');
        $result=array();
        $result['ZIPFILENAME'] = basename($filename); 
        print json_encode($result);
    } else {
        //if there is an error, you should return a special header, followed by another JSON object
        header('HTTP/1.1 500 Internal Server Booboo');
        header('Content-Type: application/json; charset=UTF-8');
        $result=array();
        $result['messages'] = $errors;
        //feel free to add other information like $result['errorcode']
        die(json_encode($result));
    }
?>
6
philippe

同じ問題がありました。私の問題は、ヘッダータイプが正しく設定されていなかったことです。

JSONエコーの前にこれを追加しました

header('Content-type: application/json');
0
Frank Violette

一番上の答えに追加:PHPおよびJqueryのサンプルコードを次に示します。

$("#button").click(function () {
 $.ajax({
            type: "POST",
            url: "handler.php",
            data: dataString,

                success: function(data) {

                  if(data.status == "success"){

                 /* alert("Thank you for subscribing!");*/

                   $(".title").html("");
                    $(".message").html(data.message)
                    .hide().fadeIn(1000, function() {
                        $(".message").append("");
                        }).delay(1000).fadeOut("fast");

                 /*    setTimeout(function() {
                      window.location.href = "myhome.php";
                    }, 2500);*/


                  }
                  else if(data.status == "error"){
                      alert("Error on query!");
                  }




                    }


        });

        return false;
     }
 });

PHP-カスタムメッセージ/ステータスの送信:

    $response_array['status'] = 'success'; /* match error string in jquery if/else */ 
    $response_array['message'] = 'RFQ Sent!';   /* add custom message */ 
    header('Content-type: application/json');
    echo json_encode($response_array);
0
Francois Brand

サーバ側:

if (mysql_query($query)) {
    // ...
}
else {
    ajaxError(); 
}

クライアント側:

error: function() {
    alert("There was an error. Try again please!");
},
success: function(){
    alert("Thank you for subscribing!");
}
0