2010-12-11 11 views
28

PHP betiği bir yere başarısız olursa PHP'nin bir AJAX hata kodu döndürmesi için bir yol var mı? Bir öğretici takip ve benim PHP bu yazdığınız:PHP'den dönüş hataları ile çalıştırın. AJAX?

 
$return['error'] = true; 
$return['msg'] = "Could not connect to DB"; 

Ve bunu JSON verileri fark edene kadar bütün iyi oldu. Standart $ _POST kullanarak hataları döndürmek ve HTML verisini döndürmek için bir yol var mı (girişte, jQuery'nin AJAX error: olayı?

cevap

76

jQuery hakkında bilmiyorum, ancak başarılı ve başarısız olanları ayırt ederse (HTTP 200 OK vs .!. HTTP = 200) Ajax istekleri, kendi PHP 200 eşit değildir bir HTTP kodu ile yanıt isteyebilirsiniz: bunu denemek

if ($everything_is_ok) 
    { 
     header('Content-Type: application/json'); 
     print json_encode($result); 
    } 
else 
    { 
     header('HTTP/1.1 500 Internal Server Booboo'); 
     header('Content-Type: application/json; charset=UTF-8'); 
     die(json_encode(array('message' => 'ERROR', 'code' => 1337))); 
    } 
+18

Teşekkür ederim :-) basit görünüyor! Ayrıca, 'Booboo' resmi mi, yoksa herhangi bir şey olabilir mi? – Bojangles

+8

Hehe. Her şey olabilir. "Resmi" terimi ise "Dahili Sunucu Hatası" dır. –

+7

@Bojangles yüzyılın yorumunu lol^_^Yorum yapamıyorum. : p – Gogol

1
$return = array(); 
$return['msg'] = "Could not connect to DB"; 

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') 
{ 
    header('Cache-Control: no-cache, must-revalidate'); 
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
    header('Content-type: application/json'); 
    die(json_encode($return)); 
} 
+0

$ _SERVER ['HTTP_X_REQUESTED_WITH'] ile istekler.Firefox gibi tarayıcılar, Accept başlığı eşleşmediğinde yanıtı değerlendirmez. – Webist

0

Umarım yardımcı olur

<!-- This is index.php ---> 
<html> 
     <head> 
      <script src="js/jquery.js" type="text/javascript"></script><!-- link to jQuery --> 
      <script language="javascript"> 
      $(document).ready(function() { 
       $('input#send').click(function(){ 
        /* Empty div#error and div#result incase they contain info from the last submission */ 
        $('#error').empty(''); 
        $('#result').empty(''); 
        /* Client-side validation */ 
        var name = $("input#name").val(); 
        var age = $("input#age").val(); 
        if (name==''){ 
         alert('Insert your name.'); 
        } 
        else if (age==''){ 
         alert('Insert your age.'); 
        } else { 
         var params = 'name=' + name + '&age=' + age; 
         $.ajax({   
          url:'b.php',   
          type:'post',     
          dataType:'html',    
          data:params, 
          cache: false,    
          success:data  
          }); 
         function data (html) { 
          var $html = $(html); // create DOM elements in a jQuery object 
          /* Return errors from 'b.php' */ 
          $html.filter('#err').appendTo("#error"); 
          /* Return valid Post */ 
          $html.filter('#res').appendTo("#result"); 
          /* Clear name input */ 
          $('input#name').val(''); 
          /* Clear age input */ 
          $('input#age').val(''); 
         } 
        } 
       }); 
      }); 
      </script> 
      <style type='text/css'> 
       #error{ 
        color:maroon; 
        font-weight:bold; 
       } 
       #result{ 
        color:green; 
        font-weight:bold; 
       } 
      </style> 
     </head> 
     <body> 
      <div id="error"></div><!-- View Errors --> 
      <div id="result"></div><!-- View valid Post --> 
      <input type='text' name='name' id="name" value='' /><br/ > 
      <input type='text' name='age' id="age" value='' /><br/ > 
      <input type='submit' name='send' id="send" value='Send' /> 
     </body> 
. AJAX PHP veri sadece transfer için
<?php 
/* This is b.php */ 
if(($_POST['name']=='')||($_POST['age']=='')){ 
    $error = '<div id="err">Error: Fill in ALL fields.</div>'; 
} elseif(is_numeric($_POST['name'])){ 
    $error = '<div id="err">Error: Name should NOT contain numbers.</div>'; 
} elseif(!is_numeric($_POST['age'])){ 
    $error = '<div id="err">Error: Age should ONLY contain numbers.</div>'; 
} else{ 
    $result = '<div id="res">Hi '.$_POST['name'].', you are '.$_POST['age'].' years old.</div>'; 
} 
echo $error; 
echo $result; 
?> 
+3

Bu, OP tarafından talep edilen $ .ajax hata olayını tetiklemez. –

-2

, Json kodlama veya anahtar değeri çiftleri her zaman gerekli değildir. Sadece string kullanımı ile yapılabilir.

Bu işlevselliği açıklayan örnek kod aşağıdadır.

 

    $query = "SELECT email FROM login WHERE email = '". mysqli_real_escape_string($conn,$email) ."' AND password = '". mysqli_real_escape_string($conn,$pass) ."'" ; 

    $result = mysqli_query($conn,$query); 
    $row=mysqli_fetch_row($result); 

    $row_cnt = mysqli_num_rows($result); 
    $s_email = $row[0]; 

    if ($row_cnt == 1) { 
     $response="success"; 
    } else { 
    $response = "Invalid Credentials"; 
    } 

    $conn->close(); 

    $_SESSION["email"]= $s_email; 
    echo $response; 

Bu kod, 'başarı' yanıtının php kodunu çağıran ajax'e nasıl geri gönderileceğini gösterir. Ayrıca ajax'ta, yanıtı almak için aşağıdakiler yapılabilir.

 

    $.ajax({ type : 'POST', 
      data : {email: $('#email').val(), password: $('#pass').val()}, 
      url : 'login.php',    
      success: function (data) { 
      if(data == 'success'){ //the value echoed from php can be stored in the data variable of ajax 
       window.location.assign('upload.php'); 
      } 
      else{ 
       alert(data); 
      } 
      }, 
      error: function (xhr) { 
      alert("error"); 
     } 
    }); 

yukarıda konsept, aynı zamanda birden fazla değer geri uzatılabilir. Bu yöntem, bir dize formatında PHP'den AJAX'e basit bir veri aktarımına izin verir.

Benzersiz bir ayırıcıyla ayrılmış, php'den ajax'a bir yanıt olarak göndermek için ihtiyacımız olan her şeyi yanıltarak basit bir adım atmak zorundayız. ajax içinde değişkendir sonra ajax değişken veriler sadece yukarıdaki örnek ve basit bir işlev benzerlerinde olduğu gibi alınamadı

 

    echo $response.#; 
    echo $email.#; 
    echo $password.#; 
    echo "Hello".#; 
    echo "World"; 

,

 

    var res = data.split("#"); 

veri. Res dizisi daha sonra ihtiyacımız olan her şey için js içinde kullanılabilir.

+0

Bu, orijinal soruma cevap vermiyor. Kendi veri formatımı kullanmak istemedim (ki bu gerçekten kötü bir fikir), ben aslında durum başlığında 500 göndermek istedim. Bir kenara, JSON ile ilgili sorun nedir? 'Böyle karmaşık cevapları görmek beni acıtıyor. '; Cevabınız muhtemelen kendi veri formatınızı oluşturarak en gereksiz yere karmaşıktır. Ayrıca mysqli_ * 'yerine [PDO] (http://php.net/manual/en/book.pdo.php) (veya daha iyi bir alternatif; PHP ekosistemine ayak uydurmadım) kullanmalısınız. Daha iyi güvenlik için. – Bojangles

+0

Maalesef, ifade diğer cevaplara karşı rahatsız edici görünüyordu. Ben sadece json kodlaması yerine veri döndürmek için basit bir fikir önerdim. Verilerin kontrolüne sahip olmak, bazen fonksiyonelliklere dayanmak yerine çok yardımcı olur. Ve mysqli'yi sadece örnek bir PDO için kullandım, en iyi yöntemlerden biri. –

İlgili konular