【问题标题】:PHP - creating JSON but header doesn't appearPHP - 创建 JSON 但标题不出现
【发布时间】:2011-02-19 03:15:02
【问题描述】:

我正在从 PHP 中的 mySQL 查询结果创建一个 JSON 字符串。但是由于某种原因,当我将结果保存到文件以进行完整性检查时,PHP“标题”函数没有附加任何内容。下面是代码:

        header("Content-Type: application/json");

    if(mysql_num_rows($result)){
            $dataResults = '{"Data":[';
            $first = true;
            $row = mysql_fetch_assoc($result);

            while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
                    if($first) {
                            $first = false;
                    } else {
                            $dataResults = $dataResults . ',';
                    }
                    $dataResults = $dataResults . json_encode($row);
            }
            $dataResults = $dataResults . ']}';
    } else {
            $dataResults = '[]';
    }

    file_put_contents('/Applications/MAMP/htdocs/PHP/results.json', $dataResults);

输出看起来不错,只是缺少“Content-Type: application/json”。我做错了什么?

【问题讨论】:

  • header() 函数将标头发送到浏览器。它绝不会以任何方式将任何内容放入文件或字符串中。如果您希望文件中包含该标题,则需要将其添加到 $dataResults 字符串。
  • 另外,使用 json_encode() 函数可以省去一些麻烦。 :-)
  • 为什么你一半是手写 JSON 一半是使用json_encode?为什么不构建你想要的结构然后编码整个东西?

标签: php mysql json


【解决方案1】:

header 将 HTTP 标头附加到 Web 服务器的 HTTP 响应中。它不会产生任何输出或将任何内容写入任何文件。文件没有 HTTP 标头,它们是 HTTP 协议的一部分,该协议用于在 Web 服务器和浏览器之间进行通信。

【讨论】:

    【解决方案2】:

    为什么header() 会向文件中写入任何内容?

    header() 使用mod_php 中的响应钩子设置响应标头信息,或者如果使用 CGI,则使用 CGI 等效项。

    文本文件不包含除编码(如果有的话)之外的任何元信息。

    【讨论】:

      【解决方案3】:

      由于一些人已经声明头函数不会向文件写入任何内容,我将向您展示一些代码。

               $dom = new DOMDocument("1.0");
           $node = $dom->createElement("markers");
           $parnode = $dom->appendChild($node);
      
           header("Content-type: text/xml");
      
      
          //Iterate through the rows, adding XML nodes for each
           while ($row = @mysql_fetch_assoc($result)){
               $node = $dom->createElement("marker");
               $newnode = $parnode->appendChild($node);
               $newnode->setAttribute("name", $row['bName']);
               $newnode->setAttribute("address", $row['Street'].", ".$row['City']);
               $newnode->setAttribute("lat", $row['lat']);
               $newnode->setAttribute("lng", $row['lng']);
               $newnode->setAttribute("distance", $row['distance']);
               $newnode->setAttribute("Webpage", $row['Webpage']);
           }
      
           $dom->formatOutput = true;
           $dom->save("/Applications/MAMP/htdocs/PHP/DOM.xml");
      

      该代码的输出结果如下:

      <?xml version="1.0"?>
      <markers>
      <marker name="Lake House Diagnostic Program " address="123 S. Lake St., Aurora" lat="41.757786" lng="-88.321419" distance="0.000166859373254629" Webpage="http://www.auntmarthas.org/"/>
      </markers>
      

      所以你看到它会在我创建 XML 输出时生成标题。

      【讨论】:

      • 不,它没有。无论有没有header 调用,该代码都会产生相同的输出。我以两种方式运行它以确保。您的 text/xml 内容类型 HTTP 标头与 XML 文件中的 &lt;?xml 行之间没有关系,这只是 DOM 模块创建的 XML 标记的一部分。
      猜你喜欢
      • 2019-02-24
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 2017-07-01
      • 1970-01-01
      • 2021-08-31
      相关资源
      最近更新 更多