Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema con JSON [PHP y javascript] [encode / decode]

Estas en el tema de Problema con JSON [PHP y javascript] [encode / decode] en el foro de PHP en Foros del Web. Buenas! tengo un problema que no logro resolver referente a JSON, PHP y Javascript. El problema consisten en que desde javascript envio un array JSON ...
  #1 (permalink)  
Antiguo 26/06/2014, 11:58
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Problema con JSON [PHP y javascript] [encode / decode]

Buenas!

tengo un problema que no logro resolver referente a JSON, PHP y Javascript.
El problema consisten en que desde javascript envio un array JSON a PHP y en php al utilizar la funcion decode() me devuelve un valor null como respuesta.

primero, como empaqueto y envio desde javascript :
Código:
                var estructuraJSONN = '{"nombre":"brais"}';
		var estructuraParseadaJSON = JSON.parse(estructuraJSONN);
						
		var estructuraNativaJSON = JSON.stringify(estructuraParseadaJSON);
		var Qn = "Qn=" + encodeURIComponent(estructuraNativaJSON); // Qn significa consulta nombre
						
		var request = ObjectDeusExMachina.ObjectHttpRequest.loadHttpRequest(); // llamo a la instancia de XMLHttpRequest()
		var url = " *** " // oculto la direccion por movitos obvios				
						
		request.open("POST", url,true);
		request.setRequestHeader("Content-type", "application/x-www-form-urlencoded", true);
		request.send(Qn);
						
		console.log(estructuraNativaJSON); // hago un console.log para ver lo que estamos enviando
						
		request.onreadystatechange = function(){
						
		if( request.readyState == 4 ) {
								
		    if( request.status == 200 ) {
										
			var respuesta =	request.responseText;
			console.log(request.responseText); // otro console.log para ver lo que nos devuelve PHP

                    }
                }
codigo php de como obtengo y manipulo lo que me llega desde Javascript
Código PHP:
Ver original
  1. <?php
  2.  
  3.     $requestName = $_POST['Qn']; // obtenemos lo que hemos enviado desde Javascript
  4.     $requestNameDedoce = json_decode($requestName);
  5.    
  6.     $salida = json_encode($requestNameDedoce); // al usar decode y encode deberia de enviarse el mensaje tal y como llego es decir decodificamos obtenemos un objeto json y volvemos a codificar para enviar un array JSON
  7.     echo $salida; // en el segundo console.log veo que me devuelve null
  8.  
  9. ?>

Aparentemente, al menos para mi, el codigo expuesto deberia funcionar y devolvernos el mismo array json que enviamos, en vez de eso obtengo un valor null como responseText ¿que estoy haciendo mal?
  #2 (permalink)  
Antiguo 26/06/2014, 16:14
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

nadie? , es que llevo horas probando y testeando el código y no encuentro en donde podria estar el error :S
  #3 (permalink)  
Antiguo 26/06/2014, 16:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

El asunto es que no podemos adivinar los valores que recibes y así, mientras no nos ayudes a depurar y compartir dichos detalles veo complicado que podamos decirte algo más que eso.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 26/06/2014, 16:41
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

pero si he puesto todo el codigo , y comentado! (es una practica poco habitual xD), a ver ... :

como veis, en json que envio es : '{"nombre":"brais"}' , y despues de pasar por todo el codigo que expuse arriva, php me devuelve null , y con mis pruevas he confirmado que a php llega el valor : '{\"nombre"\:"brais"}' y es cuando hago el decode() cuando me devuelve el valor null.

es decir, por algun motivo, supongo que de codificacion, php no puede realizar json_decode() y devuelve null.

PS. los valores de cada variable creo que se ven, si hay alguna duda exponedla.
  #5 (permalink)  
Antiguo 26/06/2014, 16:46
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Y si des-escapas esas comillas que llegan en tu json ?
__________________
Salu2!
  #6 (permalink)  
Antiguo 26/06/2014, 16:58
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Yo me refiero a depurar del lado donde anda mal, ¿no te parece lógico?

Es decir, en tu script, al recibir el POST:

¿Tienes habilitado el reporte de errores?

¿Cómo sabes que estás recibiendo correctamente las cosas?

¿Cómo te aseguras que no existió un error al interpretar el JSON?

Tan fácil como agregar un var_dump() del $_POST para ver lo que realmente recibes, si nosotros pudiéramos adivinar dicho resultado no habría que molestarte tanto.

Y tu problema, básicamente, es que asumes que PHP recibe todo perfecto y puesto a que no depuras nada esperas a que acertemos casi magicamente sin conocer más información al respecto.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 26/06/2014, 17:03
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Cita:
Iniciado por Italico76 Ver Mensaje
Y si des-escapas esas comillas que llegan en tu json ?
justamente ahora mismo estaba en eso , usando esto :
Código Javascript:
Ver original
  1. str_replace('\', '', $requestName );

si pongo \ el resto del codigo se comenta y no sirve, no se que poner por que con codigo html como veis arriva no me va.
  #8 (permalink)  
Antiguo 26/06/2014, 17:04
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Cita:
Iniciado por pateketrueke Ver Mensaje
Yo me refiero a depurar del lado donde anda mal, ¿no te parece lógico?

Es decir, en tu script, al recibir el POST:

¿Tienes habilitado el reporte de errores?

¿Cómo sabes que estás recibiendo correctamente las cosas?

¿Cómo te aseguras que no existió un error al interpretar el JSON?

Tan fácil como agregar un var_dump() del $_POST para ver lo que realmente recibes, si nosotros pudiéramos adivinar dicho resultado no habría que molestarte tanto.

Y tu problema, básicamente, es que asumes que PHP recibe todo perfecto y puesto a que no depuras nada esperas a que acertemos casi magicamente sin conocer más información al respecto.
Ya he depurado el error, es al usar decode, y obviamente si leiste el codigo de ariva veras que uso la consola para depurar ademas de ver los paquetes enviados para saber que se esta enviando y que se esta recibiendo.
Ahora necesito hacer lo que dice Italico76 , pero no se como reemplazar el valor de \ , estoy usando : &#92 como codigo html pero tampoco va.
  #9 (permalink)  
Antiguo 26/06/2014, 17:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Cita:
Iniciado por Albuss Ver Mensaje
Ya he depurado el error, es al usar decode, y obviamente si leiste el codigo de ariva veras que uso la consola para depurar ademas de ver los paquetes enviados para saber que se esta enviando y que se esta recibiendo.
[...]
Bueno, ¿y nosotros cómo podríamos adivinar que información se está enviando y recibiendo?

La función de console.log() existe únicamente en el navegador, ¿y en el servidor dónde estás depurando?

Yo no veo nada.

El tema, es que en teoría el JSON es correcto y debería funcionar de manera transparente:
Código PHP:
Ver original
  1. // en teoría esto es lo que recibes?
  2. $json = '{"nombre":"brais"}';
  3.  

Y bueno, en teoría eso funciona porque recibes correctamente la estructura del JSON.

Pero claro que si no recibes exactamente eso pues json_decode() no funcionará y eso es bastante obvio para todos, ¿qué te impide hacer el var_dump() y compartir lo que devuelve?

Código PHP:
Ver original
  1. $requestName = $_POST['Qn'];
  2. var_dump($requestName);

¿Es complicado?

Cita:
Ahora necesito hacer lo que dice Italico76 , pero no se como reemplazar el valor de \ , estoy usando : \ como codigo html pero tampoco va.
Vamos, que si "des escapar" es la solución entonces todo está mal, porque si todo estuviera en orden eso no debería ser necesario.

Tú decides que solución buscas a tu problema: la de corregir con hacks lo que no comprendes, o la de entender la técnica y depurar las inconsistencias.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 26/06/2014, 17:16
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

lo que sale de Javascript : {"nombre":"brais"}
lo que recibe PHP : {\"nombre\":\"brais\"}

estoy tratando de quitar esos \ usando str_replace() , pero si hago esto : str_replace('\', '', $requestName) el codigo se comenta y no puedo hacer nada, he intentado usando el codigo equivalente en html tal que asi : str_replace('&#92', '', $requestName) pero tampoco me va ya que no reconoce el \ y no hace el reemplazo ¿alguna idea?
  #11 (permalink)  
Antiguo 26/06/2014, 17:19
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Cita:
Iniciado por Albuss Ver Mensaje
lo que sale de Javascript : {"nombre":"brais"}
lo que recibe PHP : {\"nombre\":\"brais\"}
Si PHP está recibiendo las comillas ya escapadas se puede deber a dos razones:

1. Del lado del cliente, tal vez el uso de encodeURIComponent() sea innecesario, debes revisar una referencia al respecto de si es requerido o no.

2. Del lado del servidor, tal vez tienes la configuración de magic_quotes (versiones viejas de PHP) habilitada y eso definitivamente escapa muchas cosas sin que te enteres.

Cita:
Iniciado por Albuss Ver Mensaje
estoy tratando de quitar esos \ usando str_replace() , pero si hago esto : str_replace('\', '', $requestName) el codigo se comenta y no puedo hacer nada, he intentado usando el codigo equivalente en html tal que asi : str_replace('\', '', $requestName) pero tampoco me va ya que no reconoce el \ y no hace el reemplazo ¿alguna idea?
Eso se debe a que no puedes usar '\' tal cual pues la barra invertida es especial y debes usarla dos veces para que se tome literal.

Código PHP:
Ver original
  1. // MAL
  2. $str = '\';
  3.  
  4. // BIEN
  5. $str = '\\';
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 26/06/2014, 17:22
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

ya he probado a quitar la funcion de encodeURIComponent() [llevo toda la tarde testando este tipo de posibles], y no , no interviene en el resultado final.

ps. var_dump($requestName); me devuelve : string(22) "{\"nombre\":\"brais\"}"
  #13 (permalink)  
Antiguo 26/06/2014, 17:25
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Cita:
Iniciado por Albuss Ver Mensaje
ya he probado a quitar la funcion de encodeURIComponent() [llevo toda la tarde testando este tipo de posibles], y no , no interviene en el resultado final.

ps. var_dump($requestName); me devuelve : string(22) "{\"nombre\":\"brais\"}"
Revisa entonces tu configuración de magic_quotes, puede que ahí esté el problema.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #14 (permalink)  
Antiguo 26/06/2014, 17:27
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Cita:
Iniciado por pateketrueke Ver Mensaje
Revisa entonces tu configuración de magic_quotes, puede que ahí esté el problema.

ya esta, tu mismo me has dado la solucion : str_replace('\\', '', $requestName), muchas gracias.

Pd. ahora mismo estoy bajo un subdominio y no puedo cambiar la configuracion de PHP por que la pagina en primer plano podria venirse a bajo.
  #15 (permalink)  
Antiguo 26/06/2014, 17:27
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

¿Y si se las quitas con stripslashes?

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #16 (permalink)  
Antiguo 26/06/2014, 17:29
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Cita:
Iniciado por Alexis88 Ver Mensaje
¿Y si se las quitas con stripslashes?

Saludos
tambien sirve, gracias.
  #17 (permalink)  
Antiguo 26/06/2014, 17:29
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Cita:
Iniciado por Albuss Ver Mensaje
ya esta, tu mismo me has dado la solucion : str_replace('\\', '', $requestName), muchas gracias.

Pd. ahora mismo estoy bajo un subdominio y no puedo cambiar la configuracion de PHP por que la pagina en primer plano podria venirse a bajo.
El tema es que eso no es ni de lejos una solución, es un hack.

Imagina que no tienes control sobre los datos, entonces dentro de los datos viene una barra invertida que puede significar muchas cosas, ¿qué pasaría si reemplazas todas las barras invertidas?

Cita:
¿Y si se las quitas con stripslashes?
Nada trivial.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #18 (permalink)  
Antiguo 26/06/2014, 17:32
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

si te refieres a miedo de que me hagan un inyection mediante una consulta sql, uso un modulo especifico para 'limpiar' lo que meto en cada consulta.

por otro lado, de momento no puedo tocar la configuracion de PHP , no soy yo el responsable ni tengo el cargo para hacerlo.
  #19 (permalink)  
Antiguo 26/06/2014, 17:33
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

No, no me refiero a la seguridad ni mucho más, sólo me refiero a la integridad de los datos.

Si haces un str_replace() o stripslashes() deformas la intención original de los datos, por eso es que magic_quotes es una característica que ya ha sido retirada en versiones actuales de PHP.

¿Acaso no entiendes a lo que me refiero?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #20 (permalink)  
Antiguo 26/06/2014, 17:36
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Cita:
Iniciado por pateketrueke Ver Mensaje
No, no me refiero a la seguridad ni mucho más, sólo me refiero a la integridad de los datos.

Si haces un str_replace() o stripslashes() deformas la intención original de los datos, por eso es que magic_quotes es una característica que ya ha sido retirada en versiones actuales de PHP.

¿Acaso no entiendes a lo que me refiero?

Perfectamente y se que es algo que no deberia de ser, pero como ya he dicho, yo no tengo autorizacion para cambiar la version o configuracion de PHP dentro de mi proyecto, ya que la pagina principal lleva mucho tiempo y es posible que quien haya activado esa configuracion la necesite.

de todas formas acabo de enviar un correo sobre este tema a quien SI tiene potestad para configurar o cambiar la version de PHP.
  #21 (permalink)  
Antiguo 26/06/2014, 17:56
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problema con JSON [PHP y javascript] [encode / decode]

Cita:
Iniciado por pateketrueke Ver Mensaje
Vamos, que si "des escapar" es la solución entonces todo está mal, porque si todo estuviera en orden eso no debería ser necesario.

Tú decides que solución buscas a tu problema: la de corregir con hacks lo que no comprendes, o la de entender la técnica y depurar las inconsistencias.
Solo aclarar que estoy 100% de acuerdo en NO-HACKS

Solo trataba de ayudar al compañero un poco sin tiempo para buscar una solucion mejor.
__________________
Salu2!

Etiquetas: encode, javascript, json
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:26.