Question

J'ai un formulaire sur une page qui ajoute de nouvelles données à une base de données via jQuery. Il fonctionne très bien, mais parfois chie le serveur hors et je reçois un 500 (Internal Server Error) , mais c'est parce que mon serveur suce.

Le problème est que je parfois l'erreur de serveur après le PHP fait l'ajout de la base de données, mais au lieu d'obtenir un message de réussite, je reçois l'erreur, même si l'ajout a été fait. Alors, comment dois-je aller à ce sujet pour vous assurer que le PHP n'ajoute pas les données si je reçois l'erreur?

[Et oui, je vais finir par passer à un nouveau serveur, mais aucun serveur est parfait]

Voici le script:

$.ajax({
  type: "POST",
  url: "/clase/do-add",
  data: $("#add").serialize(),
  dataType: "json",
  timeout: 8000,
  beforeSend: function() {
    var icon = '<p class="loading-add"></p>'; // loading icon
    $('form#add').append(icon);
  },
  success: function(data) {
    if (data.error == true) { // php returns error = true if name is invalid
      alert('Invalid name.');
      $('form#add').find('p').remove();
    } else {
      // make the addition
    }
  },
  error: function () { 
    $('form#add').find('p').remove();
    alert('Error. Try again.');
  }
});
Était-ce utile?

La solution

Vous pouvez envelopper vous ajax appeler dans une fonction et « reqest » à nouveau la fonction d'erreur.

Quelque chose linke ceci:

jQuery.fn = function yourajaxfunction(){
    $.ajax({
      type: "POST",
      url: "/clase/do-add",
      data: $("#add").serialize(),
      dataType: "json",
      timeout: 8000,
      beforeSend: function() {
        var icon = '<p class="loading-add"></p>'; // loading icon
        $('form#add').append(icon);
      },
      success: function(data) {
        if (data.error == true) { // php returns error = true if name is invalid
          alert('Invalid name.');
          $('form#add').find('p').remove();
        } else {
          // make the addition
        }
      },
      error: function () { 
        $('form#add').find('p').remove();
        // ####### i added this:
        $(this).yourajaxfunction();
        alert('Error. Try again.');
      }
    });
}

Ou vous pourriez avoir une fonction de veille qui vérifie à nouveau après quelques millisecondes avant de faire exécuter à nouveau la fonction à l'erreur:

$(this).idle().yourajaxfunction();

Fonction veille utilisée ci-dessus:

jQuery.fn.idle = function(time){
    var o = $(this);
    o.queue(function(){
       setTimeout(function(){
          o.dequeue();
       }, time);
    });
    return o;
};

Mais la meilleure chose est de fixer le serveur .. ce genre de choses est juste hacks et des correctifs qui compensent un autre problème: le mauvais serveur. :)

Il est donc pas une bonne idée pour les scénarios de production.

Autres conseils

vous pouvez créer un contrôle de l'insert à la base de données, si l'ajout d'une erreur de retour.

   ...
   error: function () { 
        var fError = function() {

             $('form#add').find('p').remove();
             alert('Error. Try again.');

            };

       $.ajax({
          type: "GET",
          url: "/clase/do-check",
          data: {id: id}, // id for check
          dataType: "json",
          success: function(data) {
            if (!data.ok)
               fError();
          },
          error: function () { 
               fError();
          }
        });              
   }
   ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top