警告:无法修改头信息 - 头部已发送(PHP)
警告:无法修改头信息 - 头部已发送(PHP)
我的问题与以下帖子有些相似:
但在我的情况下,我选择在确定登录表单没有验证错误,并且用户的登录信息与数据库匹配后才开始会话。以下是相关代码:
登录页面(在任何html之前)
session_name('username'); session_name('ip'); session_name('start'); session_start();
Login.php片段(在html的body中)
} else {
$user = $_POST['username'];
$userpass = md5($_POST['password']);
$login_results = statement("select username, password from `$admin` where username='$user' and password='$userpass'");
if (mysql_num_rows($login_results)!= 1) {
$errmsg = "登录失败:用户名或密码不存在";
}else {
$_SESSION['username'] = "$user";
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
header("Location: index.php");
}
}
}
}
如果您查看上面代码的else块,我正在验证登录,如果验证成功,我想分配会话变量并转到我的主页。主页的开头有以下代码:
//Session Timeout Script -- 用于确定用户闲置的时间。如果用户闲置时间超过会话时间,则注销用户。 //在超时脚本之后,还会检查用户名和IP地址的有效性,如果其中任何一个失败,则将用户重定向到登录页面。 session_cache_expire( 20 ); session_start(); $inactive = 1200; if(isset($_SESSION['start']) ) { $session_life = time() - $_SESSION['start']; if($session_life > $inactive){ header("Location: logout.php"); } } $_SESSION['start'] = time(); $newip = $_SERVER['REMOTE_ADDR']; if (!isset($_SESSION['username']) || empty($_SESSION['username']) || $newip!= $_SESSION['ip']) { header('Location: login.php'); }
现在阅读前面作者的问题,提到header()应该是发送重定向的代码中的第一件事情,而在我的情况下是login.php。这样做可以让我登录,但是当我注销时,我会销毁所有的会话,并使用header()将我发送回登录页面。这将导致登录页面重新定向回主页,因为它是第一行代码被读取到的。有没有办法避免这种情况?这样我就不需要重复我已经在login.php的顶部放置的一些代码逻辑了吗?
Andre
“Warning: Cannot modify header information - headers already sent (PHP)”这个问题是由于在PHP代码中出现了输出内容导致的。解决方法是确保在PHP代码之前没有任何输出内容,并且确保header()函数只被调用一次。
这个问题可能出现在PHP文件的开头和结尾处有空格的情况下,像下面的例子所示:
如你所见,在PHP标签的开始之前有一个空格。当PHP代码和HTML混合在一起时,这会引发一些可笑的错误。
另外,我记得调用session_start()函数必须是打开PHP标签之后的第一行代码。
还有一件事情。据我所记得,不能多次调用header()函数。级联调用是不可能的。
重新阅读一遍错误信息后,它声称输出已经发送到在header()函数执行之前的一个包含文件中。我进入那个文件,去掉了空格,现在它运行正常了,非常感谢M2X。
当然!;-] 不要忘记将问题标记为已回答,以便其他可能遇到相同问题的人可以找到答案。
这个问题的出现原因是因为在调用header
函数之前已经有输出了。在调用header
函数之前不能有任何输出,因为header
函数是http本身所需要的,没有其他方法可以绕过这个限制。然而,你可以在调用session_start()
之后再调用header
函数。
所以你可以先启动会话,从$_POST
检查登录数据,然后开始输出html。
顺便问一下,为什么连续使用三个session_name
?
好的,我将我的if else代码块(else代码块在帖子中显示)移动到任何html输出之前,并删除了session_name,代码从<? session_start()开始。但错误仍然存在...我按照你推荐的方法进行操作。现在header()函数可以保持在else代码块中吗?因为此时还没有输出,它仅仅是在检查post后的登录数据。
忽略这个帖子Cek,罪魁祸首是多余的空格。
解决这个问题的方法是在调用header
函数之前确保没有任何输出。可以将header
函数放在代码的最开始处或者在调用session_start()
之后再调用header
函数。另外,还要注意避免在代码中使用多余的空格。
(Warning: Cannot modify header information - headers already sent (PHP)) 这个问题通常是由于在PHP文件中输出内容之后再尝试修改HTTP头部信息导致的。下面我们来看一下这个问题出现的原因以及解决方法。
出现这个问题的原因是在PHP文件中输出内容之后再尝试修改HTTP头部信息。在PHP文件中,如果在输出内容之后再尝试修改HTTP头部信息,就会导致这个错误的产生。这是因为HTTP头部信息必须在输出内容之前被修改,否则就会出现冲突。
解决这个问题的方法有以下几种:
1. 确保在输出内容之前修改HTTP头部信息。在PHP文件中,如果需要修改HTTP头部信息,一定要确保在输出内容之前进行修改。这可以通过将修改头部信息的代码放在PHP文件的顶部来实现。
2. 使用输出缓冲。输出缓冲可以将所有输出的内容先保存在缓冲区中,等到需要输出时再一次性输出。这样就可以在输出内容之前修改HTTP头部信息,避免出现错误。
3. 检查PHP文件是否存在额外的空格或换行符。有时候,PHP文件中可能存在不可见的空格或换行符,它们会在输出内容之前被发送到浏览器,导致无法修改HTTP头部信息。可以通过在PHP文件的开头使用ob_clean()函数来清空输出缓冲区,并确保文件中没有额外的空格或换行符。
通过以上几种方法,我们可以避免(Warning: Cannot modify header information - headers already sent (PHP))这个问题的出现,并正确地修改HTTP头部信息。