2010-12-11 21 views
28

Czy istnieje sposób, aby PHP zwróciło kod błędu AJAX, jeśli skrypt PHP gdzieś się zawiedzie? byłem po samouczek i wpisałem to do mojego PHP:Błędy zwracane przez PHP działają przez. AJAX?

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

I wszystko było dobrze, aż zdałem sobie sprawę, że to dane JSON. Czy istnieje sposób zwracania błędów przy użyciu standardowego pliku $ _POST i zwracanych danych HTML (tak jak w przypadku zdarzenia jQuery AJAX error:?

Odpowiedz

76

Nie wiem o jQuery, ale jeśli rozróżnia on udane i nieskuteczne (HTTP 200 OK vs .! HTTP = 200) żądania Ajax, można skrypt PHP reagować z kodem HTTP nie równa 200.

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

Dziękuję :-) Wygląda prosto! Czy też "Booboo" jest oficjalny, czy może być cokolwiek? – Bojangles

+8

Hehe. To może być wszystko. "Oficjalnym" terminem jest "Wewnętrzny błąd serwera". –

+7

@Bojangles komentarz wieku lol^_^Nie mogę powstrzymać się od komentowania. : 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

Musisz wymusić żądania z $ _SERVER ['HTTP_X_REQUESTED_WITH'].przeglądarki takie jak Firefox nie oceniają odpowiedzi, gdy nagłówek Accept nie jest zgodny. – Webist

0

to wypróbować Nadzieja pomaga

<!-- 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> 
.
+3

Nie powoduje to zdarzenia błędu $ .ajax, zgodnie z żądaniem OP. –

-2

Do prostego przesyłania danych z PHP do AJAX, kodowanie Json lub pary wartości klucza nie zawsze są konieczne. Można to zrobić po prostu za pomocą obsługi ciągów.

Przykładowy kod wyjaśniający tę funkcję znajduje się poniżej.

 

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

Ten kod pokazuje, jak odpowiedź "powodzenie" jest wysyłana do ajaxu wywołującego kod php. Dalej w ajax można zrobić, aby odzyskać odpowiedź.

 

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

Powyższa koncepcja może zostać przedłużony do powrotu wielu wartości również. Ta metoda umożliwia proste przesyłanie danych z PHP do AJAX w formacie ciągu.

Musimy wykonać prosty krok echa wszystkiego, co musimy wysłać w odpowiedzi od php do ajax, oddzielone przez unikalny separator.

 

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

Następnie dane zmienne Ajax może być po prostu pobierany jak w przykładzie powyżej i o prostej funkcji podobnego

 

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

danych, jest zmienna w obrębie AJAX. Tablica res może być następnie używana w js dla dowolnego celu, którego potrzebujemy.

+0

To nie odpowiada na moje oryginalne pytanie. Nie chciałem przetasować własnego formatu danych (co jest naprawdę złym pomysłem), właściwie chciałem wysłać 500 w nagłówku statusu. Na marginesie, co jest nie tak z JSON? "Ból na tak skomplikowane odpowiedzi mnie boli"; twoja odpowiedź jest prawdopodobnie najbardziej niepotrzebnie skomplikowana dzięki stworzeniu własnego formatu danych. Powinieneś także używać [PDO] (http://php.net/manual/en/book.pdo.php) (lub lepszej alternatywy, nie nadążam za ekosystemem PHP) zamiast 'mysqli_ *' dla lepszego bezpieczeństwa. – Bojangles

+0

Przepraszam, jeśli oświadczenie okazało się obraźliwe dla innych odpowiedzi. Właśnie zaproponowałem prosty pomysł na zwrócenie danych zamiast kodowania json. Kontrola danych czasami jest bardzo pomocna, zamiast polegać na wbudowanych funkcjach. I użyłem mysqli tylko na przykład PDO jest zdecydowanie jedną z najlepszych metod. –

Powiązane problemy