web-dev-qa-db-fra.com

json_encode renvoie NULL?

Pour une raison quelconque, l'élément "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 pour 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?

116
tarnfeld

Je parie que vous récupérez des données en encodage non-utf8: essayez de mettre mysql_query('SET CHARACTER SET utf8') avant votre requête SELECT.

253
ntd

Si vous avez au moins PHP 5.5, vous pouvez utiliser json_last_error_msg () , qui renverra une chaîne décrivant le problème.

Si vous n'avez pas la version 5.5, mais que vous êtes sur/supérieur à la version 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 identificateurs sont les suivants:

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

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 est l'erreur.

117
K. Norbert

la réponse de ntd n'a pas résolu mon problème. Pour ceux qui se trouvent dans la même situation, voici comment j'ai finalement géré cette erreur: Juste utf8_encode chacun de vos résultats.

while($row = mysql_fetch_assoc($result)){
    $rows[] = array_map('utf8_encode', $row);
}

J'espère que ça aide!

17
Pablo Abdelhay

il y a quelques jours, j'ai le même problème avec 1 table. 

Essayez d'abord: 

echo json_encode($rows);
echo json_last_error();  // returns 5 ?

Si la dernière ligne renvoie 5, le problème vient de vos données . Je sais, vos tables sont en UTF-8, mais données non 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 la base de données.

Solution? Recherchez les nouvelles données (Excel, page Web), modifiez le fichier source via PSPad (ou autre), modifiez le codage en UTF-8 , supprimez toutes les lignes et placez les données de l'original. Sauvegarder. Entrez dans DB

Vous pouvez également modifier le codage en utf-8, puis toutes les lignes manuellement (donnez des colonnes avec des caractères spéciaux - desc, ...). Bon pour les esclaves ...

9
Ivo Urbanek

Vous devez passer la chaîne encodée en utf8 dans json_encode. Vous pouvez utiliser les fonctions utf8_encode et array_map() comme ci-dessous:

<?php
    $encoded_rows = array_map('utf8_encode', $rows);
    echo json_encode($encoded_rows);
?>
5
koder

La méthode recommandée par PHP.net pour définir le jeu de caractères est la suivante:

mysqli_set_charset ('utf8')

4
bejs

AHHH !!! Cela a l'air tellement mauvais que ça me fait mal à la tête. Essayez quelque chose de plus comme ça ...

<?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);
?>
  • Lors de l'itération sur mysql_num_rows, vous devez utiliser < et non <=. Vous devez également mettre en cache cette valeur (la sauvegarder 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)
  • Vous n'avez pas besoin de copier explicitement chaque valeur de cette façon, vous ne faites que rendre cela plus difficile. Si la requête renvoie plus de valeurs que ce que vous avez indiqué, n'indiquez que celles que vous souhaitez dans votre code SQL.
  • mysql_fetch_array renvoie les valeurs à la fois par key et par int. 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 vous suggérer de remplacer le corps de la boucle par quelque chose comme:

$rows[] = array_map('htmlentities',$row);

Peut-être y a-t-il des personnages spéciaux qui gâchent les choses ...

4
mpen

Pour ceux qui utilisent PDO, la solution est similaire à la réponse de ntd .

De la PHP PDO :: __ page de construction , en tant que commentaire de l'utilisateur Kiipa au live dot com:

Pour obtenir le jeu de caractères UTF-8, vous pouvez le spécifier dans le DSN.

$ link = new PDO ("mysql: hôte = localhost; nombase = DB; charset = UTF8");

3
MichaelS

Pour moi, un problème où json_encode renvoyait le codage null d'une entité était dû au fait que mon implémentation jsonSerialize avait récupéré des objets entiers pour des entités associées; J'ai résolu le problème en m'assurant d'extraire l'ID de l'entité lié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 des entités. 

0
Victor S