【问题标题】:PHP session not logging out / unsetPHP会话未注销/未设置
【发布时间】:2017-04-16 04:41:10
【问题描述】:

我知道这个问题有很多重复,但我尝试了其中几个,但没有一个得到回答。

这是我的 logout.php 代码:

<?php
    session_start();
    require './codefiles/dbhelper.php';
    $dbh = new DbHelper();
    $dbh->Execute('UPDATE surveyors SET LoggedIn=\'0\', SessionID=\'\' WHERE Username=\''.$_SESSION['username'].'\'');
    session_unset();
    session_abort();
    session_destroy();
    $_SESSION = array();
    unset($_SESSION['username']);
    unset($dbh);
    header('location:index.php');
?>

但是会话变量太“顽固”而无法删除。两个会话值都没有被清除,会话变量也没有被删除。对象 $dbh 未设置,但未设置 $_SESSION['username'];

另一个不相关的问题,尽管我在我的 SQL 查询中设置了 LoggedIn = 0,但它在数据库中只是保持为 1。 LoggedIn 字段的类型为“位”。 SessionID 字段设置为空白。

请问有什么解决办法吗?

编辑:

删除了echo $dbh-&gt;error,因为它是不必要的。

编辑 2:

按照 Hossam Magdy 的建议添加了 session_destroy()

【问题讨论】:

  • 你试过session_destroy();php.net/manual/en/function.session-destroy.php吗?
  • 哦,是的。我有。
  • 如果我错了,请纠正我。中止会话似乎就像关闭它,从而阻止写入存储。我想知道是什么阻止你使用 session_set_save_handler() 和实现 SessionHandlerInterface 的类?
  • @frz3993:我会给session_set_save_handler()一个机会。

标签: php session


【解决方案1】:
<?php
include 'codefiles/dbhelper.php';

if(!isset($_SESSION['id'])) 
{
    header ("Location: login_form.php");
}
else
{
    session_destroy();
    die('You have been logged out.<meta http-equiv="refresh" content="0;url=login_form.php">');
}
?>

这基本上是“注销”结构。

【讨论】:

  • 但是session_destroy() 无法正常工作,无论是在 logout.php 中还是在任何其他页面中。
【解决方案2】:

我不知道为什么,但是用于销毁会话的代码在 logout.php 中无法正常工作。它在 index.php 和其他文件中工作,但会出现各种不可预知的行为。

找到解决问题的方法。 logout.php 的代码如下:

<?php
    session_start();
    $_SESSION['logout'] = TRUE;
    header('location:index.php');
?>

并将此代码添加到 index.php

# Implement logout functionality
<?php
    session_start();
    if(isset($_SESSION['logout']) && $_SESSION['logout'] == TRUE){
        foreach($_SESSION as $var => $value){
            unset($_SESSION[$var]);
        }
        session_destroy();
        session_unset();
    }
?>

它可能不是一个标准化的解决方案,但代码每次都适合我,没有不可预测的行为。

感谢大家分享他们的想法。

【讨论】:

  • 我猜在设置新的会话值之前,foreach unset 必须在 logout.php 或 login.php 中,在 index.php 中对我不起作用,因为我破坏了我需要的会话。无论如何,这是一个奇怪的问题。你测试过这个stackoverflow.com/questions/16759719/… 吗?
  • 正如我所说,我的代码在任何文件中都有效,但在我的 logout.php 中无效(不知道为什么)。如果它对您不起作用,可能是因为我们的逻辑不同。无论如何,您建议的链接解决了我的另一个问题,每次注销后重新生成一个新的会话 ID。谢谢。
【解决方案3】:

试试这个

<?php
session_start();
require './codefiles/dbhelper.php';
$dbh = new DbHelper();
$dbh->Execute('UPDATE surveyors SET LoggedIn=\'0\', SessionID=\'\' WHERE Username=\''.$_SESSION['username'].'\'');

echo session_status() . '<br />';

session_unset();    
session_destroy();

echo session_status();  

// header('location:index.php');

让我们看看 session_status() 是怎么说的。 但是在我的项目中 unset && destroy 工作。

【讨论】:

  • 虽然我正在使用 session_start(),但调用 session_destroy() 会引发以下警告:警告:session_destroy():试图破坏 C:\xampp\htdocs\xxxxxxxxx\index 中的未初始化会话。 php.关于echo session_status(),它打印1
  • session_status 是第一次、第二次还是两者都返回 1?根据php.net/manual/es/function.session-status.php 1 表示没有活动会话。
  • session_unset()session_destroy() 之前调用session_status() 返回2,之后返回1。然后调用print_r($_SESSION); 打印会话中的所有变量。
  • 对不起,我尝试了自己的项目。取消设置和销毁后 print_r($_SESSION);返回数组()。真的很奇怪。
  • 请在您的项目中尝试我的解决方案并告诉结果。是否符合预期?
猜你喜欢
  • 2013-10-18
  • 2019-08-03
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 2013-04-17
相关资源
最近更新 更多