好吧,我已经阅读了无法修改的标题
但是我仍然收到错误
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