Pour une raison quelconque, l'élément «description» revient NULL
avec le code suivant:
<?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);
?>
Voici le schéma de ma base de données:
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
Voici ce qui est repris sur la page:
[{"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"}]
Des idées?
$r['description']
extérieur de l'instruction for ()?Réponses:
Je parie que vous récupérez des données dans un encodage non utf8: essayez de mettre
mysql_query('SET CHARACTER SET utf8')
avant votreSELECT
requête.la source
Si vous avez au moins PHP 5.5, vous pouvez utiliser json_last_error_msg () , qui retournera une chaîne décrivant le problème.
Si vous n'avez pas 5.5, mais êtes sur / au-dessus de 5.3, vous pouvez utiliser json_last_error () pour voir quel est le problème.
Il renverra un entier, que vous pourrez utiliser pour identifier le problème dans la documentation de la fonction . Actuellement (2012.01.19), les identifiants sont:
Celles-ci peuvent changer dans les versions futures, il est donc préférable de consulter le manuel.
Si vous êtes en dessous de 5,3, vous n'avez pas de chance, il n'y a aucun moyen de demander quelle était l'erreur.
la source
La réponse de ntd n'a pas résolu mon problème. Pour ceux qui sont dans la même situation, voici comment j'ai finalement géré cette erreur: juste utf8_encode chacun de vos résultats.
J'espère que ça aide!
la source
il y a quelques jours, j'ai le MÊME problème avec 1 table.
Essayez d'abord:
Si la dernière ligne renvoie 5, le problème vient de vos données . Je sais, vos tableaux sont en UTF-8, mais pas de données saisies . Par exemple, l'entrée était dans un fichier txt, mais créée sur une machine Win avec un codage stupide (dans mon cas Win-1250 = CP1250) et ces données ont été entrées dans le DB.
Solution? Recherchez de nouvelles données (Excel, page Web), modifiez le fichier txt source via PSPad (ou autre chose), changez le codage en UTF-8 , supprimez toutes les lignes et mettez maintenant les données de l'original. Sauver. Entrez dans DB .
Vous pouvez également modifier uniquement le codage en utf-8, puis modifier toutes les lignes manuellement (donner des cols avec des caractères spéciaux - desc, ...). Bon pour les esclaves ...
la source
JSON_PARTIAL_OUTPUT_ON_ERROR
option pour voir le problème (par exemple, le champ avec UTF8 sera nul).Vous devez passer la chaîne encodée en utf8 dans json_encode. Vous pouvez utiliser
utf8_encode
etarray_map()
fonctionner comme ci-dessous:la source
AHHH !!! Cela semble tellement faux que cela me fait mal à la tête. Essayez quelque chose de plus comme ça ...
mysql_num_rows
vous ne devez<
pas utiliser<=
. Vous devez également mettre en cache cette valeur (l'enregistrer dans une variable) au lieu de la recompter chaque boucle. Qui sait ce qu'il fait sous le capot ... (peut-être efficace, je ne suis pas vraiment sûr)mysql_fetch_array
renvoie les valeurs parkey
et parint
. Vous n'utilisez pas les index, alors ne les récupérez pas.Si cela pose vraiment un problème avec
json_encode
, puis-je suggérer de remplacer le corps de la boucle par quelque chose commePeut-être qu'il y a des caractères spéciaux là-dedans qui salissent les choses ...
la source
null
null
alors il probablement estnull
. Essayezecho $row['description'].'<br/>';
dans cette boucle et voyez ce qu'elle dit.La méthode recommandée par PHP.net pour définir le jeu de caractères est maintenant la suivante:
mysqli_set_charset ('utf8')
la source
Pour toute personne utilisant PDO, la solution est similaire à la réponse de ntd .
Depuis la page PHP PDO :: __ construct , en tant que commentaire de l'utilisateur Kiipa sur live dot com :
la source
Pour moi, un problème où json_encode retournait un encodage nul d'une entité était dû au fait que mon implémentation jsonSerialize récupérait des objets entiers pour les entités associées; J'ai résolu le problème en m'assurant que j'ai récupéré l'ID de l'entité associée / associée et appelé -> toArray () lorsqu'il y avait plus d'une entité associée à l'objet à sérialiser json. Remarque, je parle de cas où un
implements JsonSerializable
sur les entités.la source
J'ai eu le même problème et la solution était d'utiliser ma propre fonction au lieu de
json_encode()
la source