¿json_encode devuelve NULL?

Resuelto tarnfeld asked hace 54 años • 10 respuestas

Por alguna razón, el elemento "descripción" aparece NULLcon el siguiente código:

<?php
include('db.php');

$result = mysql_query('SELECT * FROM `staff` ORDER BY `id` DESC LIMIT 2') or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($result)){
    $rows[] = $row;
}

echo json_encode($rows);
?>

Aquí está el esquema de mi base de datos:

CREATE TABLE `staff` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` longtext COLLATE utf8_unicode_ci,
  `description` longtext COLLATE utf8_unicode_ci,
  `icon` longtext COLLATE utf8_unicode_ci,
  `date` longtext COLLATE utf8_unicode_ci,
  `company` longtext COLLATE utf8_unicode_ci,
  `companyurl` longtext COLLATE utf8_unicode_ci,
  `appurl` longtext COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Esto es lo que se repite en la página:

[{"id":"4","name":"Noter 2","description":null,"icon":"http:\/\/images.apple.com\/webapps\/productivity\/images\/noter2_20091223182720-thumb.jpg","date":"1262032317","company":"dBelement, LLC","companyurl":"http:\/\/dbelement.com\/","appurl":"http:\/\/noter2.dbelement.com"},{"id":"3","name":"Noter 2","description":null,"icon":"http:\/\/images.apple.com\/webapps\/productivity\/images\/noter2_20091223182720-thumb.jpg","date":"1262032317","company":"dBelement, LLC","companyurl":"http:\/\/dbelement.com\/","appurl":"http:\/\/noter2.dbelement.com"}]

¿Algunas ideas?

tarnfeld avatar Jan 01 '70 08:01 tarnfeld
Aceptado

Apuesto a que está recuperando datos en codificación que no es utf8: intente anteponer mysql_query('SET CHARACTER SET utf8')su SELECTconsulta.

ntd avatar Dec 29 '2009 00:12 ntd

Si tiene al menos PHP 5.5, puede usar json_last_error_msg() , que devolverá una cadena que describe el problema.

Si no tiene 5.5, pero está en/por encima de 5.3, puede usar json_last_error() para ver cuál es el problema.

Devolverá un número entero que puede utilizar para identificar el problema en la documentación de la función . Actualmente (19.01.2012), los identificadores son:

0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8

Estos pueden cambiar en futuras versiones, por lo que es mejor consultar el manual.

Si está por debajo de 5.3, no tiene suerte, no hay forma de preguntar cuál fue el error.

K. Norbert avatar Dec 29 '2009 01:12 K. Norbert

La respuesta de ntd no resolvió mi problema. Para aquellos en la misma situación, así es como finalmente manejé este error: Simplemente utf8_encode cada uno de tus resultados.

while($row = mysql_fetch_assoc($result)){
    $rows[] = array_map('utf8_encode', $row);
}

¡Espero eso ayude!

Pablo Abdelhay avatar Mar 13 '2013 14:03 Pablo Abdelhay

Debe pasar una cadena codificada en utf8 en json_encode. Puede usar utf8_encodey array_map()funcionar como se muestra a continuación:

<?php
    $encoded_rows = array_map('utf8_encode', $rows);
    echo json_encode($encoded_rows);
?>
koder avatar Nov 07 '2012 13:11 koder

Hace unos días tuve el MISMO problema con 1 mesa.

Primero intenta:

echo json_encode($rows);
echo json_last_error();  // returns 5 ?

Si la última línea devuelve 5, el problema está en sus datos . Lo sé, tus tablas están en UTF-8, pero no hay datos ingresados . Por ejemplo, la entrada estaba en un archivo txt, pero se creó en una máquina Win con una codificación estúpida (en mi caso Win-1250 = CP1250) y estos datos se ingresaron en la base de datos.

¿Solución? Busque nuevos datos (Excel, página web), edite el archivo de texto fuente a través de PSPad (o cualquier otra cosa), cambie la codificación a UTF-8 , elimine todas las filas y ahora coloque los datos del original. Ahorrar. Ingrese a la BD .

También puede cambiar la codificación a utf-8 y luego cambiar todas las filas manualmente (proporcione columnas con caracteres especiales: desc, ...). Bueno para los esclavos...

Ivo Urbanek avatar Feb 22 '2013 18:02 Ivo Urbanek