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

Muhammad Abrar
quelle
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);
    }
}
Alex
quelle
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 ...
}
Marc B.
quelle
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));
    }
?>
philippe
quelle
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);
Francois Brand
quelle
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');
Frank Violette
quelle
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!");
}
larachiwnl
quelle
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.

Roland Roos
quelle