Por alguna razón, la "descripción" del artículo vuelve 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?
$r['description']
fuera de la declaración for ()?Respuestas:
Apuesto a que está recuperando datos en una codificación que no es utf8: intente poner
mysql_query('SET CHARACTER SET utf8')
antes de suSELECT
consulta.fuente
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 usar para identificar el problema en la documentación de la función . Actualmente (2012.01.19), los identificadores son:
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.
fuente
La respuesta de ntd no resolvió mi problema. Para aquellos en la misma situación, así es como finalmente manejé este error: Simplemente use utf8_encode cada uno de sus resultados.
¡Espero eso ayude!
fuente
Hace unos días tengo el MISMO problema con 1 mesa.
Primero intente:
Si la última línea devuelve 5, el problema está en sus datos . Lo sé, sus tablas están en UTF-8, pero no se ingresaron datos . 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 txt de origen 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 (proporcione cols con caracteres especiales - desc, ...). Bueno para esclavos ...
fuente
JSON_PARTIAL_OUTPUT_ON_ERROR
opción para ver el problema (por ejemplo, el campo con UTF8 será nulo).Debe pasar una cadena codificada en utf8 en json_encode. Puede usar
utf8_encode
yarray_map()
funcionar como se muestra a continuación:fuente
AHHH !!! Esto se ve tan mal que me duele la cabeza. Prueba algo más parecido a esto ...
mysql_num_rows
que debe utilizar<
no<=
. También debe almacenar en caché este valor (guardarlo en una variable) en lugar de que vuelva a contar cada ciclo. Quién sabe lo que está haciendo debajo del capó ... (podría ser eficiente, no estoy muy seguro)mysql_fetch_array
devuelve los valores porkey
y porint
. No estás usando los índices, así que no los busques.Si esto realmente es un problema
json_encode
, entonces podría sugerir reemplazar el cuerpo del bucle con algo comoPerhpas hay algunos caracteres especiales que están arruinando las cosas ...
fuente
null
null
, probablemente lo seanull
. Pruebeecho $row['description'].'<br/>';
en ese bucle y vea lo que dice.La forma recomendada de PHP.net para configurar el juego de caracteres es ahora la siguiente:
mysqli_set_charset ('utf8')
fuente
Para cualquiera que use PDO, la solución es similar a la respuesta de ntd .
Desde la página de construcción PHP PDO :: __ , como comentario del usuario Kiipa en live dot com :
fuente
Para mí, un problema en el que json_encode devolvería la codificación nula de una entidad fue porque mi implementación jsonSerialize obtuvo objetos completos para entidades relacionadas; Resolví el problema asegurándome de obtener el ID de la entidad relacionada / asociada y llamé -> toArray () cuando había más de una entidad asociada con el objeto para ser serializado json. Tenga en cuenta que estoy hablando de casos en los que se trata
implements JsonSerializable
de entidades.fuente
Tuve el mismo problema y la solución fue usar mi propia función en lugar de
json_encode()
fuente