2011-01-05 16 views
1

jQueryを使用してデータベースに新しいデータを追加するフォームがあります。それは正常に動作しますが、時々サーバがクラップアウトし、(内部サーバエラー)が発生しますが、それは私のサーバが吸うためです。jQuery:内部サーバーエラー応答の処理

問題は、PHPがデータベースに追加した後にサーバーエラーが発生することがありますが、成功メッセージが表示される代わりに、追加が行われたにもかかわらずエラーが発生することです。では、エラーが発生した場合にPHPがデータを追加しないようにするにはどうすればよいですか?

[はい、私は最終的に新しいサーバーに切り替えますが、何のサーバが完璧ではありません]

ここではスクリプトです:

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

あなたのサーバーが吸うか、あなたの**サーバーサイドコード**が吸うからですか? –

+0

はあなたのサーバーですか?あなたはシェルにアクセスできますか? – jAndy

+0

それはサーバーです、私はページをロードするときにすべての種類の文字を取得し続けます - ><ÄWÝrÔ6¾Þ}Å''²7»äÏk''¡lh – Norbert

答えて

0

あなたが関数内で呼び出し、「reqest AJAXラップでした"エラー時に再び機能します。このリンケ

何か:

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

アイドル機能上の使用:

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

かはあなたがエラーで再び機能を実行する実行する前に、いくつかのミリ秒後に再度チェックするアイドル機能を持​​つことができます:

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

しかし、最も良いことはサーバーを修正することです。もう1つの問題、すなわち悪いサーバーを補うだけのハックとパッチです。 :)

どのような生産シナリオでも良い考えではありません。

+0

そして、あなたは最後の挿入=チェックのためにjquery + ajaxを使う必要がありますあなたのフォームの内容が保存/挿入されている場合。しかし、とにかく。それはハックの束です。私はサーバーを修正します。 :) –

+0

サーバーの修正が最善の方法でした。私のhtaccessのzlib圧縮が、内部サーバーのエラーと奇妙な文字を引き起こしていました。ありがとう! – Norbert

0

返されたエラーが追加された場合、データベースへの挿入のコントロールを作成できますか。

... 
    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(); 
      } 
     });    
    } 
    ... 
関連する問題