¿json_encode devuelve NULL?
Por alguna razón, el elemento "descripción" aparece NULL
con 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?
Apuesto a que está recuperando datos en codificación que no es utf8: intente anteponer mysql_query('SET CHARACTER SET utf8')
su SELECT
consulta.
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.
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!
Debe pasar una cadena codificada en utf8 en json_encode. Puede usar utf8_encode
y array_map()
funcionar como se muestra a continuación:
<?php
$encoded_rows = array_map('utf8_encode', $rows);
echo json_encode($encoded_rows);
?>
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...