我在注销php文件时遇到session_start()
和header('Location:')
的问题。
我使用html文件中的简单锚标记链接到注销文件。注销php文件是这样的:
<?php
session_start();
session_destroy();
header("Location: index.php");
?>
要查看我使用的错误的位置,
error_reporting(E_ALL);
ini_set('display_errors', '1');
我收到警告“警告:session_start():无法发送会话缓存限制器 - 已经发送的标头”在第4行(其中session_start();
是)和警告:无法修改标头信息 - 已在线发送的标头6(其中header('Location')
是)。
我已经看过其他有类似问题的人。我已经确定session_start()
之前没有空格。在它之前没有输出任何东西。我已尝试仅设置session_start()
,如果尚未设置的话。我尝试用ob_start()
缓冲它。我尝试了重定向的相对和绝对路径,以确保。但没有任何效果。
我错过了什么吗?非常感谢任何帮助。
答案 0 :(得分:9)
检查BOM
http://en.wikipedia.org/wiki/Byte_order_mark
in notepad ++ - encoding - &gt;没有BOM的utf8
修改强>
只是评论 - 你应该使用退出;在标题(“位置...”)之后,确保不会按照http://php.net/manual/en/function.header.php
中的建议运行其他任何内容答案 1 :(得分:0)
有时,结尾?>
标记会导致此问题。在包含PHP而不包含任何其他内容的文件中,删除?>
几乎总是为我解决了headers already sent
个问题。
答案 2 :(得分:0)
PHP * session_destroy()*只是问题的一部分。您还需要从$ _SESSION数组中显式删除数据。您可能还需要清理cookie。如果您同时打开多个浏览器实例(窗口或选项卡),则无法成功测试 - 它们共享相同的cookie jar,因此共享相同的PHP会话。
此代码是一个很好的注销示例。
<?php
session_start();
// CLEAR THE INFORMATION FROM THE $_SESSION ARRAY
$_SESSION = array();
// IF THE SESSION IS KEPT IN COOKIE, FORCE SESSION COOKIE TO EXPIRE
if (isset($_COOKIE[session_name()]))
{
setcookie(session_name(), '', $cookie_expires, '/');
}
// TELL PHP TO ELIMINATE THE SESSION
session_destroy();
// SAY GOODBYE...
echo "YOU ARE LOGGED OUT$uid. GOODBYE.";
// OR REMOVE THE GOODBYE MESSAGE AND ACTIVATE THESE LINES TO REDIRECT TO THE HOME PAGE
// header("Location: /");
// exit;
答案 3 :(得分:-3)
复制粘贴此
<?
session_start();
session_unset();
session_destroy();
ob_start();
header("location:home.php");
ob_end_flush();
exit();
?>