AJAX - No logro formar el JSON a enviar como respuesta de un AJAX

 
Vista:
Imágen de perfil de Berkeley

No logro formar el JSON a enviar como respuesta de un AJAX

Publicado por Berkeley (3 intervenciones) el 22/05/2015 14:43:51
Éste es mi primer post!

Saludos a todos y formulo mi problema, esperando ayuda.

La idea: es hacer una petición ajax con jQuery a un archivo llamado process.php. La idea es que este archivo saque información de una BD, la ponga dentro de un jSON, y que este jSON sea enviado como respuesta de la petición asíncrona.

El problema: el objeto jqXHR me devuelve un parsererror. He realizado tropecientas pruebas, y al parecer el problema es que json_encode() no forma el jSON correctamente cuando le paso como valor un objeto obtenido con fetch_object().

Mi AJAX:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<script type="text/javascript">
$("#formulario").on("submit", function(e) {
	e.preventDefault();
	var datos = $("#formulario").serializeArray();
	$.ajax({
		type: "POST",
		dataType: "json",
		url: "process.php",
		data: datos,
		success: function(response) {
			$("#tablaResultado").append( response.filaHTML );
			$("#mensaje").text( response.statusResponse );
		},
		complete: function(jqXHR, estado) {
			if (estado == "parsererror") {
				$("#mensaje").text( estado );
			}
		}
	});
});

Mi process.php
1
2
3
4
5
6
7
8
9
$filaHTML = "";
while ($row = $resultado->fetch_object()) {
	$filaHTML .= "<tr> <td> </td> <td>".$row->nombre."</td> <td> </td> <td> </td> </tr>";
}
$arrayRespuestas = array(
	'filaHTML' => $filaHTML,
	'statusResponse' => 'Respuesta AJAX OK'
);
echo json_encode($arrayRespuestas);




Utilizo json_last_error() para saber si se formó mal el JSON, y la respuesta que obtengo es: Caracteres UTF-8 malformados, posiblemente están mal codificados'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
switch(json_last_error()) {
case JSON_ERROR_NONE:
echo ' - Sin errores';
break;
case JSON_ERROR_DEPTH:
echo ' - Excedido tamaño máximo de la pila';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Desbordamiento de buffer o los modos no coinciden';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Encontrado carácter de control no esperado';
break;
case JSON_ERROR_SYNTAX:
echo ' - Error de sintaxis, JSON mal formado';
break;
case JSON_ERROR_UTF8:
echo ' - Caracteres UTF-8 malformados, posiblemente están mal codificados';
break;
default:
echo ' - Error desconocido';
break;
}


¿Pueden ayudarme a solucionar este problema?
Saludos!
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
Val: 47
Ha mantenido su posición en AJAX (en relación al último mes)
Gráfica de AJAX

No logro formar el JSON a enviar como respuesta de un AJAX

Publicado por Vainas (71 intervenciones) el 22/05/2015 21:41:49
Buenas:

Lo primero que he leido es que fijes esto para mysql:

1
mysql_set_charset("utf8")
Tiene que estar despues de hacer la conexion a la bbdd y antes de ejecutar una query.

Ya nos contaras mas.

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

No logro formar el JSON a enviar como respuesta de un AJAX

Publicado por Berkeley (3 intervenciones) el 23/05/2015 19:22:15
Vainas, gracias por responder. Te comento. Probé la línea de código que propones. Mi MySQL respondió que tal función ya está desaprobada, y que mejor empleara la similar pero con mysqli. Bueno, probé ambas y ninguna funcionó.

Hasta que probé utf8_encode(). Funcionó y solucioné el problema!

La función json_last_error() informa si un JSON está mal construido. Como comenté anteriormente, esa función me devolvía: Caracteres UTF-8 malformados, posiblemente están mal codificados. Para no hacer más largo el cuento, la cosa se solucionó así:

1
2
3
4
5
6
7
8
9
10
11
12
while ($row = $resultado->fetch_object()) {
	$id     = utf8_encode($row->id);
	$nombre = utf8_encode($row->nombre);
	$ciudad = utf8_encode($row->ciudad);
	$codigo = utf8_encode($row->codigo);
	$filaHTML .= "<tr> <td>".$id."</td> <td>".$nombre."</td> <td>".$ciudad."</td> <td>".$codigo."</td> </tr>";
}
$arrayRespuestas = array(
	'filaHTML' => $filaHTML,
	'statusResponse' => 'Respuesta AJAX OK'
);
echo json_encode($arrayRespuestas);

Mi BD tiene cotejamiento UF8_general_ci, con lo cual, entiendo, debería evitar el problema, ¿no?

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
Val: 47
Ha mantenido su posición en AJAX (en relación al último mes)
Gráfica de AJAX

No logro formar el JSON a enviar como respuesta de un AJAX

Publicado por Vainas (71 intervenciones) el 24/05/2015 09:48:56
Buenas:

Me alegro que lograras arreglarlo!!!

Error mio en no buscar la myslqi tambien

Lo malo de utf8_encode() por lo que he leido (ademas lo pone en la documentacion http://php.net/manual/es/function.utf8-encode.php) es que pasa de ISO-8859-1 a UTF-8 con lo cual te puede dar problemas con algun que otro caracter.

Ahora mismo me pillas con UF8_general_ci, pero ya te digo que por alli van los tiros.

Mira esto http://blog.rodrigorega.es/configurar-codificacion-utf8-apache-mysql-html/ Como debes configurar todo en UTF-8 para que funcione hasta el final.

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

No logro formar el JSON a enviar como respuesta de un AJAX

Publicado por George (3 intervenciones) el 24/05/2015 22:15:59
Bueno, pues esto es todo.

Gracias y hasta pronto!
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
sin imagen de perfil

No logro formar el JSON a enviar como respuesta de un AJAX

Publicado por roquej (1 intervención) el 10/08/2015 17:16:19
En tu archivo mi process.php declara esto: header('Content-Type: application/json; charset=utf-8'); ya con esto te funciona porque a mi me paso lo mismo.
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