标头功能无法用于注销和登录

时间:2015-03-14 07:38:51

标签: php session header

好吧,我已经阅读了cannot modify header

但我仍然收到错误

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\xampp\web\librarian_menu.php:582)

这是我的代码,我不知道我做错了什么

<body>
<?php
    @session_start();
    require 'connect.php';
    if(isset($_SESSION['lib']))
    {
        echo '<strong style="position:relative;top:25px; left:940px;">'.$_SESSION['lib'].'</strong>';
    }
    else
    {
        echo "<script>alert('You need to login first')</script>";
        header('Location: quote.php');
    }

    if(isset($_POST['log_out']))
    {
        unset($_SESSION['lib']);
        header('Location: quote.php');
    }
?>
.
.
.

2 个答案:

答案 0 :(得分:1)

如果您上面发布的内容确实是您的代码,那么问题来自哪里就很明显了。只需在打开php标记之前查看第一行代码:

<body>
<?php
@session_start();
require 'connect.php';

查看<body>代码?你先输出它。在第一个条件的else分支中存在类似的问题: first 您回显一些字符串,然后您调用header()函数。在调用header()函数之前,您不能输出/回显任何内容。

请注意,当http服务器缓存初步输出时,此类代码可能有效。但你无法保证这一点。所以你不能依赖它。显然在您的情况下,输出缓存,但在您使用header()函数之前发送。

php的这种行为的原因,对于这个问题是一个简单的问题:http标头是前面一个http回复。根据定义,在标题之前的回复中不能包含任何内容。因此,一旦php开始发送任何内容,必须关闭标题并首先发送它们。如果你之后尝试添加任何其他标题,php别无选择,只能引发错误:在该回复中发送简单是不可能的。

您必须重新构建代码,才能在其他任何内容之前发送标头。如果真的不可能,那么你可能想看看&#34;输出缓冲&#34;。它允许您阻止任何输出,并在完成所需的任何操作后稍后将其释放到客户端,例如定义其他http标头。

任何可能是旁注,只是为了让事情变得清晰:带有消息&#34;警告:无法修改标题信息......&#34; php指向您可能使用的任何html标头标记的 http标头

答案 1 :(得分:0)

在标题功能之前(例如session_start,标题),您无法向浏览器输出任何内容 - 从<body>session_start()之前的代码中删除echos和html标记,例如header()

阅读以下几行:http://php.net/manual/en/function.header.php