如何在我的代码中正确销毁PHP会话

时间:2019-02-12 15:10:02

标签: php

我已经创建了3个文件。

第一个是我的index.php文件,其中存储了我所有的HTML

// index.php file
<?php 
session_start();
?>

<?php
if (!isset($_SESSION['u_id'])) {
    header("Location: login.php");
    exit();
}
?>

第二个是我在其中创建会话的登录文件(其中的一部分)

//login.php
$_SESSION['u_id'] = $row['user_id'];
$_SESSION['u_first'] = $row['user_first'];
$_SESSION['u_last'] = $row['user_last'];
$_SESSION['u_email'] = $row['user_email'];
$_SESSION['u_log'] = $row['user_login'];
header("Location: ../index.php?login=success");
exit();

最后一个是注销,我试图破坏会话

//logout.php
<?php 

if (isset($_POST['submit'])) {
    session_start();
    session_unset();
    session_destroy();
    header("Location: ../login.php?logout");
    exit();
}

所以接下来的问题是...从代码中可以看到,如果未设置section,我将检入我的index.php文件,以将用户重定向到login.php。成功登录并注销后,我尝试访问主页“ index.php”,我希望浏览器将我重定向到login.php,但没有发生,我在检查时看到的只是白屏,没有html代码,也有控制台中没有错误。

1 个答案:

答案 0 :(得分:4)

这是因为您在 更改标题之前显示了一些内容。然后,标头已发送。和header(something)无效。

// index.php file
<?php 
session_start();
?>
<!-- there is a space below. -->

<?php
if (!isset($_SESSION['u_id'])) {
    header("Location: login.php");
    exit();
}
?>

将代码更改为

// index.php file
<?php 
session_start(); // not closing php tag just below

if (!isset($_SESSION['u_id'])) {
    header("Location: login.php");
    exit();
}
?>

呈现页面时,服务器向浏览器发送HTTP消息。

(来自Wikipedia

  

请求/响应消息包含以下内容:

     
      
  • 请求行,例如GET /logo.gif HTTP / 1.1或状态行,例如HTTP / 1.1 200 OK,
  •   
  • 标题
  •   
  • 空行
  •   
  • 可选的HTTP消息正文数据
  •   

如果在使用header();之前发送了一些邮件正文数据(甚至是空格),则将已经发送了头。由于已经定义了HTTP消息,因此之后执行header()将没有任何作用