【问题标题】:php error "headers already set" on line 1 of script脚本第 1 行的 php 错误“标头已设置”
【发布时间】:2011-05-20 04:49:37
【问题描述】:

我有一个 php 脚本,它应该为 ajax 调用生成一个 xml 文件。它正在产生此错误消息:

警告:无法修改标头信息 - 标头已由 /home/ocp/public_html/sites/all 中的(输出开始于 /home/ocp/public_html/sites/all/modules/bookDisplay/getVersions.php:1)发送/modules/bookDisplay/getVersions.php 在第 2 行

奇怪的是php脚本的开头是这样的:

<?php
  header('content-type:application/xml;charset=utf-8');

因此,在我尝试在第 2 行再次发送它们之前,第 1 行无处可发送任何标题!我发现的所有关于类似问题的讨论都在谈论额外的空格,但我已经检查并三重检查,没有多余的行或空格。

该脚本是从一个如下所示的 jquery ajax() 函数调用的:

function getVersions(){
  var bookSelected = $.data(document.body, 'book');
  $.ajax({
    cache:"false",
    type: "GET",
    dataType: "xml",
    url: "sites/all/modules/bookDisplay/getVersions.php",
    data: "book=" + bookSelected,
    success:function(xml){

    }
  });
}

这个 jquery 函数是否以某种方式发送与 php 文件中发送的标头冲突的标头?我试过删除“dataType”声明,这确实消除了错误消息。但随后响应以文本/html 的形式返回,而不是 xml。如何在没有“标头已发送”错误的情况下获得对 ajax 调用的正确 xml 响应?

【问题讨论】:

标签: php jquery xml ajax


【解决方案1】:

请注意,标头应该在之前发送。确保在 header 函数之前没有代码/html 甚至空格/缩进,并且在第一个开始 php 标记 &lt;?php 以及结束标记 ?&gt; 之前没有任何内容。

还要注意BOM (Byte Order Mark) 那里可能存在。

【讨论】:

  • 谢谢,我没有看到有人建议可能有 BOM。如何判断它是否存在?
  • @Ian:您可以通过 Representation 列下的编码来检查维基百科文章 Representations of Byte order Marks 中的字符。或者通过 SO 搜索 BOM :)
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 2014-05-21
  • 2012-06-30
  • 1970-01-01
  • 2015-11-15
  • 2018-02-08
  • 1970-01-01
  • 2016-04-21
相关资源
最近更新 更多