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
通过key
和int
返回值。 你没有使用索引,所以不要拿取他们。
如果这真的是json_encode
的问题,那么我可以build议用类似的东西replace循环体
$rows[] = array_map('htmlentities',$row);
佩尔帕斯在那里有一些特殊的字符,正在捣毁…
你应该在json_encode中传递utf8编码的string。 你可以像下面这样使用utf8_encode
和array_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) . '"]';