it-swarm.com.de

Wie gebe ich eine korrekte Erfolgs-/Fehlermeldung für JQuery .ajax () mit PHP zurück?

Ich erhalte ständig die Fehlermeldung. Es ist nichts falsch mit dem MYSQL-Teil, die Abfrage wird ausgeführt und ich kann die E-Mail-Adressen in der Datenbank sehen.

Die Client-Seite:

<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>

Die Serverseite:

<?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);
?>
63
Pieter

Sie müssen den richtigen Inhaltstyp angeben, wenn Sie JSON-Datentyp verwenden. Bevor Sie den Json wiederholen, setzen Sie den richtigen Header.

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

Zusätzlich sollten Sie überprüfen, ob die Abfrage erfolgreich ist oder nicht.

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

Auf der Kundenseite:

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

Ich hoffe es hilft.

113
Muhammad Abrar

Nur damit Sie wissen, können Sie dies zum Debuggen verwenden. Es hat mir sehr geholfen und tut es immer noch

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);
    }
}
30
Alex

Einige Leute empfehlen die Verwendung von HTTP-Statuscodes, aber ich verachte diese Praxis eher. z.B. Wenn Sie eine Suchmaschine verwenden und die bereitgestellten Schlüsselwörter keine Ergebnisse haben, würde der Vorschlag die Fehlermeldung 404 ausgeben.

Ich halte das jedoch für falsch. HTTP-Statuscodes gelten für die tatsächliche Verbindung des Browsers <-> Server. Alles an der Verbindung lief perfekt. Der Browser hat eine Anforderung gestellt, der Server hat Ihr Handler-Skript aufgerufen. Das Skript gab 'keine Zeilen' zurück. Nichts in dem bedeutet "404 Seite nicht gefunden" - die SeiteWURDEgefunden.

Stattdessen möchte ich die HTTP-Schicht vom Status Ihrer serverseitigen Vorgänge trennen. Anstatt einfach etwas Text in einer Json-Zeichenfolge zurückzugeben, gebe ich immer eine JSON-Datenstruktur zurück, die den Anfragestatus und die Anforderungsergebnisse enthält.

z.B. in PHP hätten Sie

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

Dann in Ihrem clientseitigen Code, den Sie hätten

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

Um einen AJAX Webservice zu erstellen, benötigen Sie ZWEI Dateien: 

  • Ein aufrufendes Javascript, das Daten als POST (möglicherweise als GET) mit JQuery AJAX sendet
  • Ein PHP Webservice, der ein JSON-Objekt zurückgibt (dies ist praktisch, um Arrays oder große Datenmengen zurückzugeben)

Sie rufen also zuerst Ihren Webservice mit dieser JQuery-Syntax in der JavaScript-Datei auf:

$.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);
     }
});

Ihre PHP -Datei (mywebservice.php, wie im Aufruf von AJAX geschrieben) sollte am Ende ein ähnliches Element enthalten, um einen korrekten Status für Erfolg oder Fehler anzuzeigen:

<?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));
    }
?>
5
philippe

Ich hatte das gleiche Problem. Mein Problem war, dass mein Header-Typ nicht richtig eingestellt wurde.

Ich habe dies vor meinem Json-Echo hinzugefügt

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

zur ersten Antwort hinzufügen: Hier ist ein Beispielcode von PHP und 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 - benutzerdefinierte Nachricht/Status senden:

    $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

Serverseite:

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

Client Seite:

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