您当前的位置:首页 > 网站建设笔记 >

Headers already sent错误

0

尽管使用PHP会话非常简单,但是有一个令初学者十分头疼的问题。你会看到以下消息,而不是一切都按照你预期的方式运行:

Warning:Cannot add header information-headers already sent

在介绍header()函数之前我就已经多次提到过这个问题。它也影响session_start()和setcookie()。当在使用session_start()中遇到此问题时,解决方法很简单:确保你将它直接放在PHP开始标签的后面(或在其后不远处),并确保开始标签前面没有空格。有时,即使PHP标签前面没有空格也会出现问题。这通常是由于编辑软件将字节顺序标记(BOM)插入到了脚本的开头。如果出现这种情况,打开脚本编辑器的首选项并在PHP页面中禁用BOM。当使用setcookie()来销毁会话cookie时,你很可能需要在调用函数之前发送输出到浏览器。在这种情况下,PHP允许使用ob_start()将输出保存在缓冲区中。在setcookie()完成它的工作之后使用ob_end_flush()来刷新缓冲区。

使用会话来限制访问

当你考虑限制对网站的访问时,首先出现在脑海中的词可能就是“用户名”和“密码”。尽管它们通常可以限制对网站的访问,但是对于会话来说它们并不是必须的。你可以将任何值存储为会话变量并使用它来判断是否授权对页面的访问。例如,你可以创建一个名为$_SESSION["status"]的变量,并根据它的值的不同允许访问者访问网站的不同部分,或者如果它未被设置,则不允许访问任何内容。下面给出一些演示,这会使一切更清晰并告诉你会话是如何工作的。

<?php
session_start();
//它打开了输出缓冲区并阻止输出被发送至浏览器,直到脚本结束或你使用ob_end_flush()来刷新输出。
ob_start();
ini_set("display_errors","1");
error_reporting(E_ALL);
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<?php
if(isset($_SESSION["name"])){
	echo "<p>Hi, ".$_SESSION["name"].', I remembered your name</p>';
	unset($_SESSION["name"]);
	if(isset($_COOKIE[session_name()])){
		setcookie(session_name(),"",time()-86400,"/");
	}
	//在使会话cookie失效后立即刷新输出
	ob_end_flush();
	session_destroy();
	echo '<p><a href="/uploadfile/phpfile/session_02.php">Page 2</a></p>';
}else{
	echo "<p>Sorry, I don't know you</p>";
	echo '<a href="http://www.wangzhanchengxu.com/wangzhanbj/302.html">Login</a>';
}
?>
</body>
</html>
顶部中部底部