标头函数不适用于注销和登录


Header function not working for the log out and log in

好吧,我已经阅读了无法修改的标题

但是我仍然收到错误

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');
    }
?>
.
.
.

如果你上面发布的真的是你的代码,那么问题来自哪里就很明显了。只需查看打开 php 标签之前的第一行代码:

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

看到<body>标签了吗?您先输出它。在第一个条件的else分支中也存在类似的问题:首先回显某个字符串,然后调用header()函数。在调用该header()函数之前,您不得输出/回显任何内容。

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

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

您必须重新构建代码以在任何其他操作之前发送标头。如果这真的是不可能的,那么你可能需要看看"输出缓冲"。它允许您保留任何输出,并在完成所需的任何操作(例如定义其他 http 标头)后将其释放给客户端。

任何可能的旁注,只是为了让事情变得清晰:带有消息"警告:无法修改标题信息..."PHP 指的是 HTTP 标头,而不是您可能使用的任何 HTML 标头标记。

在标头函数(例如 session_start、header)之前,您无法向浏览器输出任何内容 - 在 session_start()header()之前从代码中删除回显和 HTML 标签,如 <body>

阅读本文的前几行:http://php.net/manual/en/function.header.php