json_encode est de retour NULL?
Pour une raison quelconque, le point "description" renvoie 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
Ici est ce qui est fait l'écho 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?
- Nous allons mettre le tableau de clés entre guillemets, tout d'abord.
- Pourriez-vous fournir des informations sur le schéma de votre "personnel" de la table. Est-il une colonne appelée description?
- l'ensemble de ces champs se fera l'écho si je viens simplement faire un echo de
$r['description']
à l'extérieur de la() déclaration? - Ou peut-être quelques exemple de contenu de $r['description'] pourrait l'aider. Ce type de données est-il?
- pourriez-vous faire une capture d'écran de la base de données shema? 😉
- ajoutés à la question 🙂
- avez-vous essayé un $r = mysql_fetch_array($result); print_r($r);
- mais je ne vois pas de capture d'écran de la base de données shema, il y a juste le texte 🙂 sans blague, à côté avez-vous essayé le au-dessus de $r = mysql_fetch_array($result); print_r($r); et d'afficher le résultat en tant que 3 mo printscreen,
- Ajouté un peu plus de code ^^ voici la capture d'écran: tarnfeldweb.com/stackoverflow.png
- Quelle version de PHP est-ce?
- c'est la version php5
- Utiliser les
JSON_PARTIAL_OUTPUT_ON_ERROR
option pour voir le problème (par exemple. le champ avec l'UTF8 sera nulle). - J'ai eu le même problème. Il s'avère que les données enregistrées dans la base de données a été mal codé. Caractère français comme é,ë,' etc ont été traduits dans d'étranges personnages Ã, Ã, ¢, â' €. Pour résoudre le problème, assurez-vous de nettoyer ces étranges personnages. Il a travaillé pour moi!
Vous devez vous connecter pour publier un commentaire.
Je parie que vous êtes à la récupération des données en situation de non-codage utf8: essayer de mettre
mysql_query('SET CHARACTER SET utf8')
avant votreSELECT
requête.changing the file encoding to utf-8
comme le résultat json n'était pas venue à partir d'une requête de base de donnéesmysql_set_charset
serait une meilleure alternative:$conn = mysql_connect('host', 'user', 'password'); mysql_set_charset('utf8', $conn);
varchar
des champs de classement mis à 'utf8_bin'. Est-il quelque chose qui peut être fait à la base de données elle-même pour éviter de courir dans les questions de ce genre?Si vous avez au moins PHP 5.5, vous pouvez utiliser json_last_error_msg(), qui renvoie une chaîne de caractères décrivant le problème.
Si vous n'avez pas 5.5, mais sont sur/5.3 ci-dessus, vous pouvez utiliser json_last_error() pour voir quel est le problème.
Il va retourner un entier, que vous pouvez utiliser pour identifier le problème dans le la fonction de documentation. Actuellement (2012.01.19), les identifiants sont:
Ceux-ci peuvent changer dans les futures versions, il est donc préférable de consulter le manuel.
Si vous êtes 5.3 ci-dessous, vous êtes hors de la chance, il n'y a aucun moyen de demander à ce que l'erreur a été.
mtn anwser ne résout pas mon problème. Pour ceux dans la même situation, voici comment j'ai finalement géré cette erreur:
Juste utf8_encode chacun de vos résultats.
Espère que cela aide!
quelques jours j'ai le MÊME problème avec 1 table.
Essayez d'abord:
Si la dernière ligne renvoie 5, problème est avec vos données. Je sais, vos tableaux sont en UTF-8, mais pas saisi les données. Par exemple, l'entrée était dans le fichier txt, mais est créée sur la Victoire de la machine avec les stupides encodage (dans mon cas Gagnant-1250 = CP1250), et les données ont été saisies dans la base.
Solution? Chercher de nouvelles données (excel, web page), modifier la source d'un fichier txt via PSPad (ou autre chose), modification de l'encodage UTF-8, supprimer toutes les lignes et maintenant de mettre les données à partir de l'original. Enregistrer. Entrer en DB.
Vous pouvez également modifier l'encodage utf-8, puis de changer toutes les lignes manuellement (donner des cols avec des caractères spéciaux - desc, ...). Bon pour les esclaves...
JSON_PARTIAL_OUTPUT_ON_ERROR
option pour voir le problème (par exemple. le champ avec l'UTF8 sera nulle).Vous devriez passer en utf8 chaîne codée en json_encode. Vous pouvez utiliser
utf8_encode
etarray_map()
fonction comme ci-dessous:AHHH!!! Cela a l'air tellement mal qu'il me fait mal à la tête. Essayez quelque chose de plus comme cela...
mysql_num_rows
vous devez utiliser<
pas<=
. Vous devriez également mettre en cache cette valeur (l'enregistrer dans une variable) au lieu de l'avoir re-comptage de chaque boucle. Qui sait ce qu'il fait sous le capot... (peut-être efficace, je ne suis pas vraiment sûr)mysql_fetch_array
retourne les valeurs à la fois parkey
et parint
. Utilisez-vous pas les indices, afin de ne pas aller chercher em.Si c'est vraiment un problème avec
json_encode
, alors pourrais-je vous suggérer de remplacer le corps de la boucle avec quelque chose commePerhpas il y a quelques caractères spéciaux qui sont curage des choses...
null
null
alors il est probablement estnull
. Essayezecho $row['description'].'<br/>';
dans cette boucle et de voir ce qu'il dit.json_encode
options:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_FORCE_OBJECT
ca.php.net/manual/en/function.json-encode.phpL'PHP.net recommandé moyen de définir le jeu de caractères est maintenant ceci:
mysqli_set_charset('utf8')
Pour quiconque utilise PDO, la solution est similaire à mtn réponse.
De la PHP: PDO::__construct page, comme un commentaire de l'utilisateur Kiipa à vivre dot com:
Pour moi, d'un problème où les json_encode serait de retour null encodage d'une entité était parce que ma jsonSerialize mise en œuvre récupéré des objets entiers pour les entités liées; j'ai résolu le problème en faisant en sorte que je l'ai récupéré l'ID de la/de l'entité associée et appelle ->toArray() quand il n'y avait plus d'une entité associée à l'objet json sérialisé. Remarque, je parle des cas où l'on
implements JsonSerializable
sur les entités.J'ai eu le même problème et la solution a été d'utiliser ma propre fonction au lieu de
json_encode()