entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

4votos

php no realiza el json_encode

buenas tengo el siguiente código

case 2:
            echo "2";
            if(!($iden=mysql_connect($dbhost,$dbuser,$dbpass))){
                die('Error: No se pudo conectar con la base de datos');
            }
            mysql_select_db($database);
            $sql="SELECT * FROM posts";
            $result=mysql_query($sql);
            if(mysql_num_rows($result)){
                $reponse['posts']=array();
                while($row=mysql_fetch_assoc($result)){
                    $post=array();
                    $post['post_id']=$row['post_id'];
                    $post['title']=$row['title'];
                    $post['preview']=$row['preview'];
                    $post['body']=$row['body'];
                    $post['date_add']=$row['date_add'];
                    $reponse['posts'].array_push($reponse['posts'], $post);
                }
                $reponse['sucess']=1;
                echo json_encode($reponse);
            }else{
                $reponse['sucess']=0;
                echo json_encode($reponse);
            }
            mysql_close($iden);
            break;

el problema es que no muestra el encoge de la variable $reponse por pantalla, la conexión a la base de datos se realiza correctamente y el array se llena según lo esperado, pero al realizar el echo json_encode($reponse) no muestra nada por pantalla, he probado creando arrays y llamando a la función y eso funciona bien, pero no se porque no me codifica $reponse, muchas gracias por adelantado

magarzon comentado Nov 4, 2016

¿Te da algún error? Lo más probable es que el contenido de lo que guardas en $reponse no pueda ser codificado por algún motivo.

También es posible que esté dando un error en esta línea, que no sé muy bien lo que quieres hacer, y no llegue ni siquiera al json_encode:

$reponse['posts'].array_push($reponse['posts'], $post);

morgooth comentado Nov 4, 2016

intentaste con console.log() ?

$output = "<script>console.log( 'Debug Objects: " . $reponse . "' );</script>";
echo $output;

oscar rodriguez comentado Nov 4, 2016

respues a morgooth: me sale esto: Debug Objects: Array

oscar rodriguez comentado Nov 4, 2016

No, no me sale nada, simplemente no escribe nada en el ultimo comando, la estructura de $reponse es array_assoc(array(array_assoc))) no veo razón para que eso no se pueda codificar, y en la linea que dices lo que hace es añadir a $reponse['posts'] un array asociativo que contiene los datos del post, pero ahi no esta el error ya que he comprobado que se ejecutan todas las lineas y ademas los datos del post se añaden bien ya que puedo acceder a ellos con el comando 'echo $reponse['posts'][0]['title']'

magarzon comentado Nov 4, 2016

Haz un ouput (con echo mismo) de lo que te devuelva la función json_last_error().

Por ejemplo así:

if (FALSE === json_encode($reponse)) {
   echo 'Error: '.json_last_error();
}

Y dinos qué te sale.

Por otro lado, en la línea

$reponse['posts'].array_push($reponse['posts'], $post);

entonces te sobra la primera parte, ese $reponse['posts]'.

morgooth comentado Nov 4, 2016

Hice una prueba intentando simular tu código y no tengo problemas, espero te sirva.

Saludos

<?php

$reponse = array();
$reponse['sucess']=1; 

$reponse['posts']=array();
$post=array();
$post['post_id']="id";
$post['title']="a";
$post['preview']="b";
$post['body']="c";
$post['date_add']="d";
array_push($reponse['posts'], $post);

echo json_encode($reponse);
?>

oscar rodriguez comentado Nov 4, 2016

me sale Error:5, eso que significa?

magarzon comentado Nov 4, 2016

Es el error JSON_ERROR_UTF8, te da porque alguno de los elementos de tu array no está codificado en UTF8 (posiblemente porque tu base de datos tampoco tenga codificación UTF8).

Mi consejo es que siempre trabajes en UTF8, pero si no puedes modificar la codificación de la base de datos, puedes hacer lo siguiente:

  • Tener una función que transforme todos los string de tu array con la función utf8_encode (si tu codificación de la bd es ISO-8859-1) o con iconv (si es otra codificación). Algo engorroso
  • Utilizar esta opción en el json_encode, que lo que hace es que no trata de codificar los caracteres Unicode (aunque puede que no resuelva tu problema). Si te funciona, es menos engorroso que la función anterior:
    json_encode($reponse, JSON_UNESCAPED_UNICODE);

magarzon comentado Nov 4, 2016


oscar rodriguez comentado Nov 4, 2016

he modificado la codificación de mi base de datos a utf8_bin y me sigue saliendo lo mismo, perdón por hacer tantas preguntas es que de php no se mucho :P
Edit: y con el código

json_encode($reponse, JSON_UNESCAPED_UNICODE);

me sigue saliendo el mismo error

magarzon comentado Nov 4, 2016

Es probable que aunque hayas cambiado la codificación, los datos almacenados no se hayan convertido (o que hayas cambiado la codificación de la bd y esa tabla siga con la codificación antigua).

Lo único que te queda, si no es lo que te digo que la tabla sigue con la codificación antigua, es recorrer todos los datos que te devuelve la base de datos y comprobar cuál es el que tiene una codificación diferente y cambiarlo en la base de datos. Modifica así tu código (solo para la prueba, no vamos a hacer json_encode, solo sacar el campo que está mal codificado)

if(mysql_num_rows($result)){
   while($row=mysql_fetch_assoc($result)){
        check_codification($row, 'post_id');
        check_codification($row, 'title');
        check_codification($row, 'preview');
        check_codification($row, 'body');
        check_codification($row, 'date_add');
    }
}

Y añade esta función:

public function check_codification($data, $fieldName) {     
     //Suponemos que el valor existe, no vamos a comprobarlo con isset o similar
     $value = $data[$fieldName];
     if (is_array($value)) {
         foreach($value as $k=>$v) {
             check_codification($value, $k);
         }
     } else {
         if (true !== mb_check_encoding($value, 'UTF-8') {
            echo 'ERROR: El campo '.$fieldName.' no tiene codificación UTF-8, tiene '.mb_detect_encoding($value);
         }
     }
}

oscar rodriguez comentado Nov 4, 2016

Me sale lo siguiente:

ERROR: El campo preview no tiene codificación UTF-8, tiene ERROR: El campo body no tiene codificación UTF-8, tiene ERROR: El campo preview no tiene codificación UTF-8, tiene UTF-8ERROR: El campo body no tiene codificación UTF-8, tiene UTF-8ERROR: El campo title no tiene codificación UTF-8, tiene UTF-8ERROR: El campo preview no tiene codificación UTF-8, tiene UTF-8ERROR: El campo body no tiene codificación UTF-8, tiene UTF-8ERROR: El campo title no tiene codificación UTF-8, tiene UTF-8ERROR: El campo preview no tiene codificación UTF-8, tiene UTF-8ERROR: El campo body no tiene codificación UTF-8, tiene UTF-8

En realidad lo que hay en la base de datos son ejemplos de noticias copiadas de internet, habría alguna herramienta para convertirlas en utf8?
Edit: he encontrado una pagina que creo que lo convierte, voy a cambiar todos los campos y te digo :)

oscar rodriguez comentado Nov 4, 2016

Vale, funciona perfectamente, muchísimas gracias, me has ahorrado mucho tiempo y quebraderos de cabeza :), pon uno de tus comentarios como respuesta para que pueda marcarlo :)

pedrourday comentado Ene 10

Hola @oscar rodriguez

Yo creo que he tenido ese mismo problema. Encontré la solución en este foro

Esta en inglés. Pero no es difícil de entender. Fijate si te sirve. Solo tenes que probar.

Saludos!

1 Respuesta

0voto

$sentencesArray = json_decode($reponse, true);
$sentences = "";
echo $sentences;

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta