【问题标题】:json_encode is returning NULL?json_encode 返回 NULL?
【发布时间】:2010-12-30 15:07:18
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 首先让我们将数组键放在引号中。
  • 您能否提供有关“员工”表架构的信息。有没有一列叫做描述?
  • 如果我只是简单地在 for() 语句之外回显$r['description'],所有这些字段都会回显吗?
  • 或者来自 $r['description'] 的一些示例内容可能会有所帮助。它是什么数据类型?
  • 你能做一个数据库shema的截图吗? ;-)

标签: php null json


【解决方案1】:

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

【讨论】:

  • 嗨,这个答案救了我的命,谢谢。我在这里遇到了同样的问题。我有非 utf8 字符的值,例如“Validação de Formulários”。我知道这个问题现在有点老了,但这就是互联网的魅力!!
  • mysql_set_charset 自 PHP 5.2.3 以来出于安全原因更好。详情请见php.net/manual/en/function.mysql-set-charset.php
  • 因为 UTF8 是网络上的通用语。 PHP(严格地)使用最常见的编码,而不是使用额外的参数和开销使 API 混乱,如果您使用不常见的(或在您的情况下几乎是死的)编码,则将转换负担留给您。
  • 推荐的执行方式现在已经改变。我试图编辑这个答案以包含一个链接,但被拒绝了。正确的方法在我下面的答案中。
  • @VeeK 将您的字段存储在 UTF-8 中是不够的:您必须 configure 您的服务器以 UTF-8 格式回答客户端。 AFAIK 库存 mysql 和 mariadb 使用 latin1。
【解决方案2】:

如果你至少有 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,你就倒霉了,没办法问错误是什么。

【讨论】:

    【解决方案3】:

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

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

    希望对你有帮助!

    【讨论】:

    【解决方案4】:

    几天前,我在一张桌子上遇到了同样的问题。

    首先尝试:

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

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

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

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

    【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      对于使用 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");

      【讨论】:

        【解决方案7】:

        啊啊啊!!!这看起来很不对劲,让我头疼。尝试更多类似的东西...

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

        如果这确实是json_encode 的问题,那么我可以建议用类似的东西替换循环体

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

        也许里面有一些特殊的字符正在搞砸……

        【讨论】:

        • [{"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":"注 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"}]
        • @tarnfield:嗯,这是你想要的还是不想要的?哦..你有一些额外的信息......在这里......让我为你解决这个问题。
        • 是的,“描述”返回null
        • 如果描述返回null,那么它可能 null。在那个循环中尝试echo $row['description'].'&lt;br/&gt;';,看看它说了什么。
        • 嗨,这个答案救了我的命,谢谢。我在这里遇到了同样的问题。我有非 utf8 字符的值,例如“Validação de Formulários”。我知道这个问题现在有点老了,但这就是互联网的魅力!!
        【解决方案8】:

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

        mysqli_set_charset('utf8')

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              猜你喜欢
              • 2016-05-24
              • 1970-01-01
              • 2016-12-08
              • 1970-01-01
              • 1970-01-01
              • 2013-10-26
              • 1970-01-01
              相关资源
              最近更新 更多