json_encode返回NULL?

出于某种原因,“description”项目用下面的代码返回NULL

 <?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); ?> 

这是我的数据库的模式:

 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 

以下是在页面上显示的内容:

 [{"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"}] 

有任何想法吗?

我打赌你正在检索非UTF8编码的数据:尝试在你的SELECT查询之前放置mysql_query('SET CHARACTER SET utf8')

如果你至less有PHP 5.5,你可以使用json_last_error_msg() ,它将返回一个描述问题的string。

如果你没有5.5,但是在5.3以上,你可以使用json_last_error()来看看问题是什么。

它将返回一个整数,您可以使用它来识别函数文档中的问题。 目前(2012.01.19),标识符为:

 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 

这些可以在将来的版本中更改,所以最好参考手册。

如果你低于5.3,那么你运气不好,没办法去问错误是什么。

ntd的anwser没有解决我的问题。 对于那些在相同的情况,这里是我最终如何处理这个错误:只是utf8_encode你的每个结果。

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

希望它有帮助!

前几天我有1个表同样的问题。

首先尝试:

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

如果最后一行返回5, 问题与您的数据 。 我知道,你的表是UTF-8,但没有input数据 。 例如,input是在txt文件中,但在Win机器上用愚蠢的编码创build(在我的例子中,Win-1250 = CP1250),这个数据已经input到数据库中。

解? 寻找新的数据(excel,网页),通过PSPad(或其他) 编辑源txt文件将编码更改为UTF-8 ,删除所有行,然后从原来的数据。 保存。 进入数据库

您也只能将编码更改为utf-8,然后手动更改所有行(给col加特殊字符-desc,…)。 对奴隶好

AHHH! 这看起来很错,它伤害了我的头。 试试更像这样的…

 <?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); ?> 
  • 在遍历mysql_num_rows ,应该使用< not <= 。 你也应该caching这个值(保存到一个variables),而不是每个循环重新计数。 谁知道这是在做什么…(可能是有效的,我不太确定)
  • 你不需要像这样明确地拷贝每个值……你只是把自己变得更加困难。 如果查询返回的值超过了您在列表中列出的值,请仅列出您希望在SQL中使用的值。
  • mysql_fetch_array通过keyint返回值。 你没有使用索引,所以不要拿取他们。

如果这真的是json_encode的问题,那么我可以build议用类似的东西replace循环体

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

佩尔帕斯在那里有一些特殊的字符,正在捣毁…

你应该在json_encode中传递utf8编码的string。 你可以像下面这样使用utf8_encodearray_map()函数:

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

PHP.net推荐的设置字符集的方式现在是这样的:

mysqli_set_charset( 'UTF8')

对于任何使用PDO的人来说,解决scheme与ntd的答案类似。

从PHP PDO :: __构build页面 ,作为来自用户Kiipa在live dot com的评论

要获得UTF-8字符集,您可以在DSN中指定。

$ link = new PDO(“mysql:host = localhost; dbname = DB; charset = UTF8 ”);

我有同样的问题,解决scheme是使用我自己的function,而不是json_encode()

 echo '["' . implode('","', $row) . '"]';