json_encode返回NULL?

时间:2009-12-28 23:05:46

标签: php null json

由于某种原因,项目“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"}]

有什么想法吗?

10 个答案:

答案 0 :(得分:253)

我敢打赌,您正在检索非utf8编码的数据:尝试在mysql_query('SET CHARACTER SET utf8')查询之前添加SELECT

答案 1 :(得分:117)

如果您至少拥有PHP 5.5,则可以使用json_last_error_msg(),它将返回描述问题的字符串。

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

它将返回一个整数,您可以使用它来识别function's documentation中的问题。目前(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,你运气不好,没有办法问错误是什么。

答案 2 :(得分:17)

ntd的anwser并没有解决我的问题。对于那些处于相同情况的人,以下是我最终处理此错误的方法: 只需utf8_encode您的每个结果。

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

希望它有所帮助!

答案 3 :(得分:9)

前几天我和1张桌子有同样的问题。

首先尝试:

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

如果最后一行返回5,问题与您的数据相关。我知道,您的表格为UTF-8,但未输入数据。例如,输入是在txt文件中,但是在Win机器上使用愚蠢的编码创建(在我的情况下是Win-1250 = CP1250),并且此数据已输入到数据库中。

解决方案?通过PSPad(或其他任何东西)寻找新数据(excel,网页),编辑源文件将编码更改为UTF-8 ,删除所有行,然后放入原始数据。保存。 输入数据库

您也可以只将编码更改为utf-8,然后手动更改所有行(为cols添加特殊字符 - desc,...)。对奴隶有好处......

答案 4 :(得分:5)

你应该在json_encode中传递utf8编码的字符串。您可以使用utf8_encodearray_map()功能,如下所示:

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

答案 5 :(得分:4)

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上进行迭代时,您应使用<而不是<=。您还应该缓存此值(将其保存到变量中),而不是让它重新计算每个循环。谁知道它在幕后做了什么......(可能效率很高,我不太确定)
  • 你不需要像那样明确地复制出每个值...你只是让自己变得更难。如果查询返回的值多于您在此处列出的值,请仅列出SQL中所需的值。
  • mysql_fetch_array返回keyint的值。你没有使用索引,所以不要获取em。

如果这对json_encode确实存在问题,那么我是否可以建议用

之类的东西替换循环体
$rows[] = array_map('htmlentities',$row);

Perhpas那里有一些特殊的字符可以解决问题...

答案 6 :(得分:4)

PHP.net推荐的设置charset的方法现在是:

mysqli_set_charset('utf8')

答案 7 :(得分:3)

对于使用PDO的任何人,解决方案类似于ntd's answer

来自PHP PDO::__construct page,来自用户 Kiipa at live dot com的评论

  

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

     

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

答案 8 :(得分:0)

对我而言,json_encode返回实体的空编码的问题是因为我的jsonSerialize实现获取了相关实体的整个对象;我通过确保获取与关联/关联实体的ID并在与要进行json序列化的对象关联的实体不止一个时调用-> toArray()来解决此问题。请注意,我说的是实体上有一个implements JsonSerializable的情况。

答案 9 :(得分:-4)

我遇到了同样的问题,解决方法是使用我自己的函数而不是json_encode()

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