Wie kann ich mit PHP eine ordnungsgemäße Erfolgs- / Fehlermeldung für JQuery .ajax () zurückgeben?


73

Ich erhalte immer wieder 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);
?>

6
Erwägen Sie die Verwendung von pdo, mysql_-Funktionen sind veraltet
— Njuguna Mureithi

Antworten:


126

Sie müssen den richtigen Inhaltstyp angeben, wenn Sie JSON dataType verwenden. Setzen Sie den richtigen Header, bevor Sie den json wiedergeben.

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

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

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

Auf der Client-Seite:

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.


2
Oh, und Sie sollten zwischen serverseitigem Fehler und Übertragungsfehler unterscheiden . Ich habe einen successTeil des AJAX überprüft, um den vom Server gesendeten Wert zu überprüfen (es handelt sich also nicht um einen Übertragungsfehler).
— Muhammad Abrar

Wie speichere ich mehrere varriable wie $ response_array ['status'] = 'success', $ response_array ['userid'] = $ userid; usw.
— Inderjeet

32

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

1
@Pieter: Dann implementieren Sie Ihren eigenen js_encode :) Versuchen Sie diesen: snippets.dzone.com/posts/show/7487
— Muhammad Abrar

24

Einige Leute empfehlen die Verwendung von HTTP-Statuscodes, aber ich verachte diese Praxis eher. Wenn Sie beispielsweise eine Suchmaschine betreiben und die angegebenen Schlüsselwörter keine Ergebnisse liefern, wird empfohlen, einen 404-Fehler zurückzugeben.

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

Stattdessen bevorzuge ich die Trennung der HTTP-Schicht vom Status Ihrer serverseitigen Vorgänge. Anstatt einfach Text in einer JSON-Zeichenfolge zurückzugeben, gebe ich immer eine JSON-Datenstruktur zurück, die den Anforderungsstatus und die Anforderungsergebnisse enthält.

zB 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 hätten Sie in Ihrem clientseitigen Code

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

8

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

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

Rufen Sie 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 AJAX-Aufruf geschrieben) sollte am Ende so etwas enthalten, um einen korrekten Erfolgs- oder Fehlerstatus zurückzugeben:

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

0

Hinzufügen zur Top-Antwort: 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

Ich hatte das gleiche Problem. Mein Problem war, dass mein Headertyp nicht richtig eingestellt war.

Ich habe dies gerade vor meinem json-Echo hinzugefügt

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

0

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

... Sie möchten möglicherweise auch nach Cross-Site-Scripting-Problemen suchen ... Wenn Ihre HTML-Seiten von einer anderen Domain / Port-Kombination stammen als Ihr Rest-Service, blockiert Ihr Browser möglicherweise den Anruf.

In der Regel klicken Sie mit der rechten Maustaste auf Ihre HTML-Seite. Dann suchen Sie in der Fehlerkonsole nach Fehlern wie

Der Zugriff auf XMLHttpRequest unter '...: 8080' vom Ursprung '...: 8383' wurde durch die CORS-Richtlinie blockiert: Für die angeforderte Ressource ist kein Header 'Access-Control-Allow-Origin' vorhanden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.