由于某种原因,项目“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"}]
有什么想法吗?
答案 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_encode
和array_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
上进行迭代时,您应使用<
而不是<=
。您还应该缓存此值(将其保存到变量中),而不是让它重新计算每个循环。谁知道它在幕后做了什么......(可能效率很高,我不太确定)mysql_fetch_array
返回key
和int
的值。你没有使用索引,所以不要获取em。如果这对json_encode
确实存在问题,那么我是否可以建议用
$rows[] = array_map('htmlentities',$row);
Perhpas那里有一些特殊的字符可以解决问题...
答案 6 :(得分:4)
PHP.net推荐的设置charset的方法现在是:
答案 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) . '"]';