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

有什么想法吗?

118983 次浏览

AHHH!!! This looks so wrong it hurts my head. Try something more like this...

<?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上迭代时,应该使用 <而不是 <=。您还应该缓存这个值(将它保存到一个变量中) ,而不是让它重新计算每个循环。谁知道它在引擎盖下做什么... (可能是有效的,我不是很确定)
  • You don't need to copy out each value explicitly like that... you're just making this harder on yourself. If the query is returning more values than you've listed there, list only the ones you want in your SQL.
  • mysql_fetch_array同时返回 keyint的值。您没有使用索引,所以不要取它们。

如果这确实是 json_encode的一个问题,那么我是否可以建议用类似于

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

也许里面有些特殊的字符会把事情搞得一团糟。

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

如果至少有 PHP 5.5,则可以使用 Json _ last _ error _ msg (),它将返回一个描述问题的字符串。

如果没有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,你就不走运了,没有办法问错误是什么。

我也有同样的问题,解决方案是使用我自己的函数而不是 json_encode()

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

您应该在 json _ encode 中传递 utf8编码的字符串:

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

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

首先尝试:

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

如果最后一行返回5,则 问题在于你的数据。我知道,你们的桌子是 UTF-8,但是是 not entered data。例如,输入在 txt 文件中,但是在 Win 机器上用愚蠢的编码(在我的例子中是 Win-1250 = CP1250)创建,并且这些数据已经输入到 DB 中。

解决办法?寻找新的数据(Excel,网页) ,edit source txt file通过 PSPad (或任何其他) ,将编码改为 UTF-8,删除所有行,现在把数据从原来的。保存。进入数据库.

您也只能将编码更改为 utf-8,然后手动更改所有行(使用特殊的 chars-desc,...)。对奴隶有好处。

Ntd 的答案没有解决我的问题。对于那些处于相同情况的人,以下是我最终处理这个错误的方法: 只需对每个结果进行 utf8 _ encode 即可。

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

Hope it helps!

现在,PHP.net 推荐的设置字符集的方法是:

Mysqli _ set _ charset (‘ utf8’)

For anyone using PDO, the solution is similar to NTD 的回答.

PHP PDO: : _ _ structpage中,作为用户 Kiipa at live dot com的注释:

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

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

对我来说,json _ encode 返回一个实体的 null 编码的一个问题是因为我的 jsonSerialize 实现为相关实体提取了整个对象; 我解决了这个问题,方法是确保我提取了相关/关联实体的 ID,并且在有多个与要被 json 序列化的对象相关联的实体时调用-> toArray ()。注意,我说的是实体上有一个 implements JsonSerializable的情况。