2009-11-24 55 views
9

Possible Duplicate:
Headers already sent by PHPPHP错误:无法修改标题信息 - 头已经发出已

所以,我有我的网页上这个输出..不理解为什么我把它弹出。我是新来的,虽然PHP,所以也许它的东西很容易解决

-I有header.php文件,其中包括所有重要信息,以及具有页面的横幅。这个header.php包含在每个页面上。

-I有它检查会话值,以确保用户可以在某一个页面。如果不允许用户在那里,我踢他们回到登录页面

这是错误虽然出现。这是我的:

include_once ("header.php"); 

if ($_SESSION['uid']!='programmer') 
{       
header('Location: index.php'); 
echo 'you cannot be here'; 
exit; 
} 

它重定向到的索引也有标题。那么有这些多头参考给我这个错误?我没有办法做到这一点,这让我疯狂!

+2

“header.php”文件中是什么? – 2009-11-24 22:49:23

+0

横幅,配置包括连接到数据库,和一些jQuery。非常重要的文件。 – Marcus 2009-11-24 23:13:51

+1

那为什么叫'header.php'呢?为什么不'init.php'或什么? – ceejayoz 2009-11-24 23:28:32

回答

32

不能使用header()一旦文本已输出到浏览器。由于您的header.php包含可能输出的HTML,因此无法使用header()

您可以在几种方法解决这个问题:

  • 移动如果头上面的语句包括(这是行不通的,因为你的意见指出,header.php设置UID会议和其他重要东东)。
  • 在脚本的顶部调用ob_start()来缓冲输出。
+4

另外请注意,除非你'缓冲输出,在启动php标签之前甚至有一个空行(或空格)会遇到这个错误,因为为了确定是否可以发送标题,即使空白也算作输出。 – Dathan 2009-11-24 22:54:48

+0

没问题,所以我在if语句之后添加了包含头,并且摆脱了错误,但是,现在,当我正确登录时,无论如何,我都会重定向到index.php ..为什么? 网址:http://nait.jtlnet.com/~fpkj5v0r/index.php 用户:程序员 密码:prog123 - 这是我现在的代码: <? \t \t \t \t \t 如果($ _SESSION [ 'UID'] ='程序员!) \t \t \t \t \t \t \t {\t \t \t \t \t 头( '位置:的index.php'); 回声'你不能在这里'; 退出; } \t \t \t \t \t \t \t \t \t \t include_once( “header.php文件”); ?> – Marcus 2009-11-24 22:56:29

+0

而且,感谢Dathan的领导,我读到了有关空白的错误,但看起来并不是这样。我希望这很容易! – Marcus 2009-11-24 22:57:52

6

如果header.php文件“有横幅”,那么它可能会输出一些HTML内容到页面。

输出内容后,您不能发出HTTP标头。

6

发送任何其他内容后,您不能发送任何标题。在你的header.php中关闭?>标签后,一个可能的罪魁祸首是额外的空白。在任何仅用于脚本的php文件中完全省略结束标记通常是一种好的做法。

你的错误应该告诉你什么行(和哪个文件)发送输出。

1

好了,所以它的固定......不知道怎么不过,也许有人可以解释为什么这工作一下子。

这是我的代码:

include_once ("header.php"); 

if ($_SESSION['uid']!='programmer') { 
    if(isset($_SESSION['uid'])) { 
     echo $_SESSION['uid']; 
    }       

    header('Location: index.php'); 
    exit; 
} 

让我再说一遍,这一切工作吧! PHP ...你为什么现在工作?

+3

这将无法正常工作$ _SESSION ['uid']被设置。然后回声将在调用标题之前发生,这是一件坏事!所以,除非您在header.php中切换输出缓冲,否则这只会在未设置$ _SESSION ['kid']时才起作用。 – 2012-06-03 18:22:13

+0

@PeterBagnall是正确的,逻辑有缺陷;首先,当你认为有可能没有设置值时,你正在检查$ _SESSION ['uid']的值,然后检查它是否被设置... if(isset($ _ SESSION ['uid']) ){ 应该在第一个if语句中进行。 **第二**:它可能工作的原因是如果$ _SESSION ['uid'] = NULL;因此没有数据被发送到浏览器。 – Valerie 2016-02-24 04:12:03

1

我就曾经是如下重定向功能碰到了类似的错误(也看似无处):

function Redirect($url) { 
     flush(); // Flush the buffer 
     header("Location: $url"); // Rewrite the header 
     die; 
    } 

显然,你还需要添加ob_flush();完全冲洗掉老头。新功能是:

function Redirect($url) { 
     flush(); // Flush the buffer 
     ob_flush(); 
     header("Location: $url"); // Rewrite the header 
     die; 
    } 

希望这可以帮助别人有这个问题!

+0

我不明白这是如何工作的,除非使用了ob_start(),而您没有在代码中指明它。根据PHP:flush()尝试**将当前输出一路推送到浏览器**,但有一些注意事项。将内容数据发送到浏览器后,无法返回并编辑标题。 http://php.net/manual/en/function.flush.php – Valerie 2016-02-24 04:21:38

相关问题