【问题标题】:Issue on Destroying - Ending Session on Logout销毁问题 - 注销时结束会话
【发布时间】:2014-10-08 23:46:04
【问题描述】:

我有一个这样的会话设置:

<?php
session_start();
include 'conconfig.php';
$con = new mysqli(DB_HOST,DB_USER,DB_PASS,DB_NAME);

 $email = $_POST['email'];
 $pass =  $_POST['pass'];

 $query = "SELECT * FROM tempusers WHERE user='$email' AND pass='$pass'";
 $result = mysqli_query($con,$query)or die(mysqli_error());
 $num_row = mysqli_num_rows($result);
 $row=mysqli_fetch_assoc($result);
 if( $num_row >=1 ) {
  echo 'true';
     $_SESSION['uName'] = $row['uName'];
  }
 else{
  echo 'false';
 }
?>

在我的 logout.php 中有

<?php
    session_start();
    session_unset(); 
    unset($_SESSION['uName']);
    session_destroy();
    header("Location:index.php");
?>

但是 session_unset();unset()session_destroy(); 似乎都没有工作,因为在进入页面后我仍然可以使用浏览器返回按钮并返回受限页面!除了header() 没有将页面更改为index.php 之外,您能告诉我我做错了什么以及如何解决吗?

基本上,我在受限页面中有一个注销链接,就像这样

<a href="logout.php" >Logout</a>

谢谢

更新: 这是我在受限页面顶部的会话代码

<?php
 session_start();
  if(empty($_SESSION['uName'])){
     header('Location: login.php');
}
?>

【问题讨论】:

  • 如果您返回到它进入数据库的页面并授权您(假设 POST 已重新发送),则 IF 将为 TRUE,并再次设置会话。
  • 谢谢詹姆斯,但我没明白你的意思?
  • 关于您的登录流程,您的问题并不完全清楚,我的意思是:您将表单数据发布到上面的脚本,您以正确的凭据登录,会话已设置,您现在进入下一页在,您单击注销,您已注销,您单击返回,POST 数据仍然设置并检查数据库中的数据再次返回 TRUE(如 POST 数据之前所做的那样),您的会话再次创建。 - 如果在 logout.php 文件的末尾你回显你的会话(并在回显后使用exit()),你会得到什么?还设置吗?
  • 谢谢詹姆斯,我明白了,这正是我的问题,但我该如何解决呢?
  • en.wikipedia.org/wiki/Post/Redirect/Get - Stack 在 Post/Redirect/Get 上有一些很好的答案

标签: php session


【解决方案1】:

尝试重新生成会话 ID 并销毁所有数据。

<?php
    session_start();
    session_unset();
    session_destroy();
    session_write_close();
    setcookie(session_name(), '', 0, '/');
    session_regenerate_id(true);
    header("Location:index.php");
    exit();
?>

【讨论】:

  • 嗨 slapyo,感谢您的回复,但我仍然得到相同的结果
  • 重定向有效吗?开始 PHP 标记或 session_start() 函数之前没有空格对吗?
  • 不,我只是复制了您提供的所有内容,但一切都一样!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多