web-dev-qa-db-fra.com

Comment renvoyer un message de réussite/d'erreur correct pour JQuery .ajax () à l'aide de PHP?

Je continue à recevoir l'alerte d'erreur. Il n'y a rien de mal avec la partie MYSQL, la requête est exécutée et je peux voir les adresses électroniques dans la base de données.

Le côté client:

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

Le côté serveur:

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

Si vous utilisez JSON dataType, vous devez fournir le bon type de contenu. Avant de faire écho au JSON, placez le bon en-tête.

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

Correctif supplémentaire, vous devez vérifier si la requête aboutit ou non.

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

Du côté du client:

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

J'espère que ça aide.

113
Muhammad Abrar

Juste pour que vous sachiez, vous pouvez utiliser ceci pour le débogage. Cela m'a beaucoup aidé et continue de

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

Certaines personnes recommandent d'utiliser des codes de statut HTTP, mais je méprise plutôt cette pratique. par exemple. Si vous utilisez un moteur de recherche et que les mots clés fournis ne donnent aucun résultat, il est conseillé de renvoyer une erreur 404.

Cependant, je considère que c'est faux. Les codes d’état HTTP s’appliquent à la connexion actuelle du navigateur <-> au serveur. Tout à propos de la connexion s'est parfaitement déroulé. Le navigateur a fait une demande, le serveur a appelé votre script de gestionnaire. Le script a renvoyé "pas de lignes". Rien dans cela ne signifie "404 page non trouvée" - la page&EACUTE;TAITtrouvée.

Au lieu de cela, je suis favorable à la séparation de la couche HTTP de l’état de vos opérations côté serveur. Au lieu de simplement renvoyer du texte dans une chaîne JSON, je renvoie toujours une structure de données JSON qui encapsule le statut de la requête et les résultats de la requête.

par exemple. dans PHP vous auriez

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

Ensuite, dans votre code côté client, vous auriez

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

Pour créer un service Web AJAX, vous avez besoin de deux fichiers: 

  • Un Javascript appelant qui envoie des données en tant que POST (pourrait être en tant que GET) à l'aide de JQuery AJAX
  • Un webservice PHP qui renvoie un objet JSON (pratique pour renvoyer des tableaux ou une grande quantité de données)

Donc, vous appelez d’abord votre service Web en utilisant cette syntaxe JQuery, dans le fichier JavaScript:

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

Votre fichier PHP (mywebservice.php, comme indiqué dans l'appel AJAX) doit inclure quelque chose comme ceci à la fin, pour renvoyer un état de réussite ou d'erreur correct:

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

J'ai eu le même problème. Mon problème était que mon type d'en-tête n'était pas défini correctement.

Je viens d'ajouter ceci avant mon écho json

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

ajouter à la réponse: voici quelques exemples de code provenant de PHP et de 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 - envoyer un message personnalisé/statut:

    $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

Du côté serveur:

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

Côté client:

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