file_get_contents - json_decode returns null value in php
json_encode está devolviendo NULL? (9)
AHHH !!! Esto se ve tan mal que me lastima la cabeza. Prueba algo como esto ...
<?php
include(''db.php'');
$result = mysql_query(''SELECT `id`, `name`, `description`, `icon` FROM `staff` ORDER BY `id` DESC LIMIT 20'') or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($result)){
$rows[] = $row;
}
echo json_encode($rows);
?>
- Al iterar sobre
mysql_num_rows
, debe usar<
not<=
. También debe almacenar en caché este valor (guardarlo en una variable) en lugar de tener que volver a contar cada ciclo. Quién sabe lo que está haciendo bajo el capó ... (podría ser eficiente, no estoy muy seguro) - No necesita copiar cada valor explícitamente así ... solo lo está haciendo más difícil para usted. Si la consulta devuelve más valores de los que ha enumerado allí, enumere solo los que desea en su SQL.
-
mysql_fetch_array
devuelve los valores porkey
y porint
. Usted no usa los índices, así que no los busque.
Si esto realmente es un problema con json_encode
, entonces podría sugerir reemplazar el cuerpo del bucle con algo así como
$rows[] = array_map(''htmlentities'',$row);
Perhpas hay algunos caracteres especiales que están arruinando las cosas ...
Por algún motivo, el elemento "descripción" devuelve 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 para 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
Aquí está 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 una codificación que no es utf8: intente poner mysql_query(''SET CHARACTER SET utf8'')
antes de su consulta SELECT
.
Debería pasar una cadena codificada en utf8 en json_encode. Puede usar las utf8_encode
y array_map()
como a continuación:
<?php
$encoded_rows = array_map(''utf8_encode'', $rows);
echo json_encode($encoded_rows);
?>
Hace algunos días tengo el MISMO problema con 1 mesa.
Primero, intente:
echo json_encode($rows);
echo json_last_error(); // returns 5 ?
Si la última línea devuelve 5, el problema es con sus datos . Lo sé, tus tablas están en UTF-8, pero no ingresaron datos . Por ejemplo, la entrada estaba en un archivo txt, pero se creó en la máquina Win con codificación estúpida (en mi caso Win-1250 = CP1250) y esta información se ha ingresado 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. Salvar. Entrar en DB .
También puede cambiar la codificación a utf-8 y luego cambiar todas las filas manualmente (dar cols con caracteres especiales - desc, ...). Bueno para los esclavos ...
La carta de ntd no resolvió mi problema. Para aquellos en la misma situación, así es como finalmente manejé este error: solo utf8_encode cada uno de sus resultados.
while($row = mysql_fetch_assoc($result)){
$rows[] = array_map(''utf8_encode'', $row);
}
¡Espero eso ayude!
La forma recomendada de PHP.net de configurar el juego de caracteres ahora es la siguiente:
Para cualquiera que use PDO, la solución es similar a la respuesta de ntd .
Desde la página PHP PDO :: __ construct , como un comentario del usuario Kiipa en live dot com :
Para obtener el juego de caracteres UTF-8, puede especificarlo en el DSN.
$ link = nuevo PDO ("mysql: host = localhost; dbname = DB; charset = UTF8 ");
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 entero, que puede usar para identificar el problema en la json_last_error() la json_last_error() . Actualmente (2012.01.19), 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 versiones futuras, 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.
Tuve el mismo problema y la solución fue usar mi propia función en lugar de json_encode()
echo ''["'' . implode(''","'', $row) . ''"]'';