PHP - Problema al gestionar errores de php mediante jQuery

   
Vista:

Problema al gestionar errores de php mediante jQuery

Publicado por Octavio (7 intervenciones) el 27/08/2015 21:07:47
Hola a todos,

llevo unos días atascado en este tema y no encuentro la manera. Para ponernos en situación, tengo una clase conexión, un html y una página php intermedia. He estado haciendo pruebas para gestionar los errores que puedan producirse en la clase conexión y mostrarlos por pantalla sin necesidad de excepciones.

Primero he hecho una prueba sin usar ajax, y el resultado es el que esperaba

Método Abrir conexión de la clase conexión

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public function OpenConnection()
{
	// Inicializamos las variables de error
	$this->ErrNo = 0;
	$this->ErrDes = "";
 
	// Abrimos conexión
	if (!$this->IsOpen)
		$this->conn = new mysqli($this->Host, $this->User, $this->Pass, $this->Name);
 
	// Comprobamos si hay algún error
	if ($this->conn->connect_errno)
	{
		$this->ErrNo = $this->conn->connect_errno;
		$this->ErrDes = $this->conn->connect_error;
		return false;
	}
 
	$this->IsOpen = true;
 
	return true;
}

index.php
1
2
3
4
5
6
$conn = new connection();
 
if ($conn->OpenConnection())
    echo "ok";
else
    echo $conn->ErrDes;

Hasta aquí todo bien. Si falseo los parámetros de conexión me muestra el error por pantalla.
El problema viene cuando le añado ajax. Al utilizar $.ajax de jQuery, si falseo los parámetros de conexión no puedo controlar esos mensajes de error porque no entra en "success", sino en "error".

prueba.php
1
2
3
4
5
6
7
8
9
10
$conn = new connection();
$vResponse = array();
 
if (!$conn->OpenConnection())
{
    $vErrores = array('Code' => $conn->ErrNo, 'Message' => $conn->ErrDes);
    $vResponse = array('Error' =>$vErrores);
}
 
echo json_encode($vResponse);


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$.ajax({
    data: param,
    type: 'post',
    dataType: 'json',
    url: 'prueba.php',
    success: function(data){
        var strResponse = '';
 
        if (data.Error.length == 0)
            strResponse = 'ok';
        else
        {
	    for (var i = 0; i < data.Error.length; i++)
                strResponse = strResponse + '(' + data.Error[i].Code + ')-' + data.Error[i].Message + '<br />';
        }
        // Pintamos error
    },
    error: function(){
        // Excepcion
    }
});

Si no falseo la conexión me entra por el 'success' y todo correcto, pero si la falseo me entra por 'error' cuando creo que debería entrar por 'success'.

¿Alguien sabría decirme qué me está fallando? Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Vainas

Problema al gestionar errores de php mediante jQuery

Publicado por Vainas (254 intervenciones) el 29/08/2015 11:48:35
No hay error el problema es que posiblemente lo esta haciendo como esta programado.

Por partes:

Tienes herramientas en chrome como Advance REST client o Postman - REST Client (son plugins) con los que puedes hacer pruebas. Cuando pases mal los datos posiblemente php esta enviando alguna otra cabecera http que no sea la 200 OK y por eso entra a error. Con estas herramientas que te paso podrias comprobarlo tu mismo.

Por otra parte te digo que puedes controlar los mensajes en error:

1
2
3
4
error: function(jqXHR, textStatus, errorThrown) {
  //... ejemplo
console.log(jqXHR.error);
}

al error de ajax le llegan esos 3 parametros que podrias averiguar que tienen e imprimirlos con un console log.

De todas formas hare alguna prueba con tu codigo y te comento.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Vainas

Problema al gestionar errores de php mediante jQuery

Publicado por Vainas (254 intervenciones) el 29/08/2015 11:53:17
Buenas de nuevo:

Por otro lado he pensado que es posible que para atajar ese tipo de error que estas mirando puede que necesites mas bien utilizar algun bloque try{..} cacth?

No estoy muy seguro pero estaria bien que alguien en el foro nos diera alguna pista.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Vainas

Problema al gestionar errores de php mediante jQuery

Publicado por Vainas (254 intervenciones) el 29/08/2015 12:12:11
Una cosa mas. Envia la cabecera json para que el ajax la acepte como tal sino va a pensar que es texto/html (puede que lo transforme el mismo pero ante la duda):

header('Content-Type: application/json');


Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al gestionar errores de php mediante jQuery

Publicado por Octavio (7 intervenciones) el 31/08/2015 19:44:13
Saludos amigo,

lo primero agradecerte por la respuesta. Ahora vamos por partes:

Para empezar probé la Advance REST. Hice la prueba enviando una consulta vacía a un método que inserta en base de datos y me devolvió un 200 OK. Me resulto curioso y ejecuté el código depurando javascript. Como yo pensaba resultó erróneo, aunque mirando en el depurador las variables de salida ( jqxhr, textStatus, error ) vi que efectivamente, devolvía 200 OK. Lo que no entiendo es como es que .ajax() no me envía al "success" sino al "error". (Adjunto image1.rar)

En cuanto al try..catch también lo he intentado, pero el resultado es el mismo que cuando no lo tiene.
En un principio pensé que debería funcionar al igual que tu, y más yo acostumbrado a trabajar con asp.net que es así. Si se va al "catch" haciendo un "Response.Write" $.ajax() te envía al "success" y puedes controlar ahí tu mismo mediante json los errores.

Por último, probé "header('Content-Type: application/json');" pero el resultado es el mismo. De todas formas cuando hago la llamada asíncrona indico "dataType: json" y entiendo que con eso debería ser suficiente.

Seguiré haciendo pruebas y cualquier cosa que vea lo pondré por aquí. Si alguien fuera capaz de iluminarme y hacerme entender como funcionan exactamente los responses de jquery en php (lo indicado arriba) estaré muy agradecido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al gestionar errores de php mediante jQuery

Publicado por Octavio (7 intervenciones) el 31/08/2015 20:46:20
Parece que he encontrado algo, aunque no se si esto es bueno o malo, porque la verdad que no me aclaro .

prueba.html -> Código html (realiza llamada asíncrona a prueba.php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="Js/jquery-1.11.3.js"></script>
 
	<script>
		$(document).ready(function(){
			$('#btnPrueba').on('click', function(){
				var params = {
					'consulta' : $('#tbConsulta').val()
				};
 
				$('#response').html('');
 
                $.ajax({
                    type: 'post',
                    dataType: 'json',
                    url: 'prueba.php',
                    data: params,
                    beforeSend:function(){
 
                    },
                    success: function(response){
						var strMessage = '';
 
						if (response.Error.length == 0)
							strMessage = 'Correcto';
						else
						{
							for (var i = 0; i < response.Error.length; i++)
								strMessage = strMessage + '(' + response.Error[i].Code + ')-' + response.Error[i].Message + '<br />';
						}
 
						$('#response').append(strMessage);
                    },
                    error: function(jqxhr, textStatus, error){
                    	var err = textStatus + ", " + error;
                        $('#response').append(jqxhr.responseText);
						$('#response').append(err);
                    }
                });
 
 
			});
		});
	</script>
</head>
<body>
	<input type="text" id="tbConsulta" style="width:80%;">
	<input type="button" id="btnPrueba" value="Probar!">
 
	<p>Response:</p>
	<div style="border:solid 1px #000; width:90%; min-height:20px;" id="response"></div>
</body>
</html>

prueba.php -> Código php (realiza una llamada a la clase conexión que funciona correctamente)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
	include_once "Class/connection.class.php";
 
	$conn = new Connection();
	$vReturn = array("Error" => array());
 
	if (isset($_POST['consulta']))
		$strConsulta = $_POST["consulta"];
	else
		$strConsulta = "";
 
	if (!$conn->ExecuteInsert($strConsulta))
	{
		$vErrAux = array("Code" => $conn->ErrNo, "Message" => $conn->ErrDes);
		array_push($vReturn["Error"], $vErrAux);
	}
 
        // Añado otro mensaje para forzar más de 1
	$vErrAux =  array("Code" => "1234", "Message" => "prueba");
 
	array_push($vReturn["Error"], $vErrAux);
	echo json_encode($vReturn);
 
?>

El último fragmento de código intenta insertar mediante la función "ExecuteInsert()" el valor obtenido en "$('#tbConsulta').val()".
La cosa es la siguiente:

Si en "tbConsulta" introduzco cualquier valor, me retornará al "success" diciendo que la query es incorrecta (image1.rar). Sin embargo, si lo dejo vacío, me retorna a "error" y pinta lo siguiente por pantalla (image2.rar)

¿No debería de enviarme siempre por el "success" y poder controlar el error? ¿Qué diferencia hay entre los dos tipos de errores para que no actúen igual?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar