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

2votos

magarzon comentado

¿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);

2votos

morgooth comentado

intentaste con console.log() ?

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

0voto

oscar rodriguez comentado

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

0voto

oscar rodriguez comentado

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']'

2votos

magarzon comentado

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]'.

2votos

morgooth comentado

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);
?>

0voto

oscar rodriguez comentado

me sale Error:5, eso que significa?

1voto

magarzon comentado

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);

2votos

magarzon comentado


1voto

oscar rodriguez comentado

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

2votos

magarzon comentado

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);
         }
     }
}

1voto

oscar rodriguez comentado

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 :)

1voto

oscar rodriguez comentado

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 :)

-1voto

pedrourday comentado

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!

0voto

guillermofernandez comentado

Bueno Oscar Rodriguez y cual fue la solución al problema de json_encode() ?
Agradeceré tu respuesta.

2votos

oscar rodriguez comentado

Buenas Guillermo,
El problema que tenia era que los base de datos no estaba en UTF8 y por lo tanto al realizar el encode lo realizaba mal, la solución fue cambiar la codificación de la base de datos a UTF8 y ademas remplazar los datos problemáticos, es decir, las tildes y las eñes.
Espero que te sirva de ayuda, hace mucho que no programo con PHP, pero si posteas tu problema al detalle quizá sea capaz de ayudarte, sino seguro que alguno de los desarrolladores de esta plataforma te ayudara con gusto, a mi me trataron genial.

1voto

guillermofernandez comentado

@oscar rodriguez eres muy amable, muchas gracias por tu respuesta.
Saludos

1voto

pedrourday comentado

No te olvides de incluir la siguiente linea antes del json_encode:

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

Es recomendable hacerlo siempre.

1 Respuesta

1voto

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

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

Otras Preguntas y Respuestas


...

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

Conecta