2011-06-02 14 views
5

Estoy codificando una funcionalidad simple de inicio de sesión/registro usando JQuery, PHP y PostgreSQL. El siguiente código es de un archivo PHP que trata con inicios de sesión. Lanza una excepción cuando la combinación de inicio de sesión/contraseña es incorrecta.El servidor arroja una excepción, el cliente malinterpreta como éxito

$username = $_POST['username']; 
$password = $_POST['password']; 

$query = "SELECT * FROM users WHERE username='$username' AND password='$password'"; 
$result = pg_query($query) or die('Query failed: ' . pg_last_error()); 
$numResults = pg_num_rows($result); 

if ($numResults == 0) { 
    throw new Exception("Incorrect combination of username and password."); 
    //die('Incorrect combination of username and password.'); 
} 

Sin embargo, en el lado del cliente en el archivo Jquery la función se ejecuta el éxito a pesar de que el servidor inicia una excepción.

 $.ajax({ 
     type: "POST", 
     url:"login.php", 
     data: dataString, 
     success: function() { 
//THIS FUNCTION IS EXECUTED.... 
      $('#errorMsg').html('Login is successful!'); 
      $('#errorMsg').show(); 
      $('#usernameTxtBx').val(""); 
      $('#passwordTxtBx').val(""); 
     }, 
     error:function (xhr, ajaxOptions, thrownError){ 
      window.alert(xhr.status); 
      window.alert(thrownError); 
     } 
     }); 
+0

¿Qué pasa cuando se quite la matriz() llamar? – barfoon

+0

Bueno, la solicitud HTTP * no * tuvo éxito. Que la capa PHP arrojó una excepción es además del punto. Apache ejecutó, obtuvo algo de PHP (que fue salida de error, pero bueno), y lo entregó exitosamente al cliente. Si el cartero le envía una carta diciéndole que su última apelación contra la condena por asesinato fue negada, realmente apesta, pero la carta aún se entregó correctamente. –

+0

@Tomalak: Sí, pero el caso es de alguna manera diferente aquí. De acuerdo con tu metáfora, sería algo como esto. Envías una carta preguntándote si tu última apelación para una condena fue exitosa o no, y digamos que un mensaje positivo siempre está envuelto en un sobre verde y uno negativo en uno rojo, luego obtienes un sobre verde con un mensaje que dice: no tuvo éxito. Los errores no siempre deben ocurrir en el nivel del Servidor HTTP. Imho una excepción no capturada siempre debe generar algún tipo de código de error HTTP, porque es un error después de todo. – fresskoma

Respuesta

4

En primer lugar: favor ver SQL Injections, ya que son muy vulnerables ...;)

El problema es que, el HTTP response code no está configurado como algo que se interpreta como un error cuando lanza una excepción de PHP. Se podría hacer algo como esto para solucionar este:

function exception_handler($exception) { 
    header("HTTP/1.1 400 Bad Request"); 
    echo "Uncaught exception: " , $exception->getMessage(), "\n"; 
} 

set_exception_handler('exception_handler'); 

Esto establecerá el exception handler a una función de su propia, que establece la cabecera HTTP correcta antes de salir. De esta forma, jQuery ahora que se produjo un error y llama al controlador de errores en lugar de éxito.

Elegí 400 Bad Request como el código de estado, porque el error en este caso parece ser causado por una entrada incorrecta. Sugeriría subclass your own exception para comprobar si en realidad es una excepción relacionada con el cliente y, en caso contrario, envíe un 500 Internal Server Error genérico.

El gestor de errores sería algo como esto (si ha asignado el nombre UserErrorException subclase):

function exception_handler($exception) { 
    if($exception instanceof UserErrorException) { 
     header("HTTP/1.1 400 Bad Request"); 
    } else { 
     header("HTTP/1.1 500 Internal Server Error"); 
    } 
    echo "Uncaught exception: " , $exception->getMessage(), "\n"; 
} 

set_exception_handler('exception_handler'); 
3

Las excepciones de PHP NO se pueden interceptar con las capturas de Javascript. Los idiomas se ejecutan en tiempos completamente diferentes. JS solo verá su mensaje de excepción al otro lado del cable. A menos que su excepción de PHP tome medidas para enviar un código de estado HTTP de algo que no sea '200 OK', JS interpretará el texto entrante y el código 200 ok como que la solicitud AJAX se completó con éxito.

Cuestiones relacionadas