2010-12-11 10 views
28

¿Hay alguna manera de que PHP devuelva un código de error AJAX si el script PHP falla en alguna parte? estaba siguiendo un tutorial y escribió esto en mi PHP:Errores de devolución de PHP ejecutados a través de. AJAX?

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

Y todo iba bien, hasta que me di cuenta que era datos JSON. ¿Hay alguna forma de devolver errores usando $ _POST estándar y datos HTML devueltos (como en, desencadenar el evento AJAX error: de jQuery?

Respuesta

76

No sé sobre jQuery, pero si se distingue entre exitoso y fallido (HTTP 200 OK vs .! HTTP = 200) peticiones Ajax, es posible que desee su script PHP responde con un código HTTP no es igual a 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

Gracias :-) parece simple! Además, es 'Booboo' oficial, o puede ser cualquier cosa? – Bojangles

+8

Hehe. Puede ser cualquier cosa. Sin embargo, el término "oficial" es "Error interno del servidor". –

+7

@Bojangles comentario del siglo lol^_^No pude evitar comentar. : 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

Necesita forzar su solicitudes con $ _SERVER ['HTTP_X_REQUESTED_WITH'].navegadores como Firefox no evaluarán la respuesta cuando el encabezado Aceptar no coincida. – Webist

0

probar esto creo que sirve

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

Esto no desencadena el evento de error $ .ajax según lo solicitado por el OP. –

-2

Por simple transferencia de datos de PHP a AJAX, JSON codificación o pares de valores clave no son siempre necesarios. Simplemente se puede hacer usando el manejo de cadenas.

A continuación se muestra un código de ejemplo que explica esta funcionalidad.

 

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

Este código muestra cómo se envía una respuesta de 'éxito' a ajax llamando al código php. Además en ajax, se podría hacer lo siguiente para recuperar la respuesta.

 

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

El concepto anterior se puede extender a devolver múltiples valores también. Este método permite la transferencia simple de datos de PHP a AJAX en un formato de cadena.

Tenemos que seguir un simple paso de hacer eco de todo lo que necesitamos enviar como respuesta del php a ajax, separados por un único separador.

 

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

continuación, los datos variables en ajax podrían ser simplemente recuperaron como en el ejemplo anterior y una función simple como,

 

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

datos, siendo la variable dentro de ajax. La matriz de res se puede usar en js para cualquier propósito que necesitemos.

+0

Esto no responde mi pregunta original. No quería rodar mi propio formato de datos (que es una muy mala idea), en realidad quería enviar un 500 en el encabezado de estado. Como un aparte, ¿qué pasa con JSON? "Ver respuestas tan complicadas me duele". su respuesta es probablemente la más innecesariamente compleja al crear su propio formato de datos. También debería usar [PDO] (http://php.net/manual/en/book.pdo.php) (o mejor alternativa, no he estado al día con el ecosistema PHP) en lugar de 'mysqli_ *' para una mejor seguridad. – Bojangles

+0

Disculpe si la declaración parecía ofensiva a otras respuestas. Acabo de proponer una idea simple para devolver datos en lugar de la codificación json. Tener control de los datos a veces es de gran ayuda en lugar de confiar en las funcionalidades integradas. Y he usado mysqli solo para un ejemplo. PDO es uno de los mejores métodos. –

Cuestiones relacionadas