119 votes

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?

258voto

ntd Points 4244

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 .

120voto

K. Norbert Points 4797

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 sera de retour un entier, que vous pouvez utiliser pour identifier le problème dans la fonction de documentation. Actuellement (2012.01.19), les identifiants sont:

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

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é.

19voto

Pablo Abdelhay Points 178

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: utf8_encode chacun de vos résultats.

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

J'espère que cela aide!

9voto

Ivo Urbanek Points 61

quelques jours auparavant, 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 est avec vos données. Je sais, vos tableaux sont en UTF-8, mais pas les données saisies. 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.

La Solution? Chercher de nouvelles données (excel, web page), modifier la source de fichier txt via PSPad (ou tout autre), la modification de l'encodage UTF-8, supprimer toutes les lignes et maintenant de mettre les données à partir de l'original. Enregistrer. Entrez dans la 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...

9voto

koder Points 205

Vous devriez passer la chaîne encodée 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);
?>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X