【问题标题】:How to destroy two different sessions in the same php script?如何在同一个 php 脚本中销毁两个不同的会话?
【发布时间】:2016-03-21 13:05:06
【问题描述】:

在我的会话启动脚本中,我选择 session_name,然后执行 session_start。

   $session_name = rand(0,1) ? 'first' : 'second';
   session_name($session_name);
   session_start();

上述代码在每次页面加载时运行。几次页面加载后,可能会有 session_name 'first' 和 session_name 'second' 的会话。

这是我的注销脚本中的代码,用于尝试销毁 两个这些会话:

session_start();
session_name("first");
session_unset();
session_destroy();
session_write_close();

session_start();
session_name("second");
session_unset();
session_destroy();
session_write_close();

上面的脚本首先销毁,但不是第二个。如果我第二次运行注销脚本,它会破坏第二个会话,因为第一个会话已被删除。

如何在同一个脚本中销毁两个会话名称的会话?

【问题讨论】:

  • 如何检查会话是否被破坏?您的代码显示,您的第二个会话名称甚至还没有应用于您的会话。
  • 原始代码是我用于销毁会话的注销脚本。会话最初是在其他地方开始的

标签: php


【解决方案1】:

试试看

<?php
    session_name("first");
    session_start();
    echo session_status();
    session_destroy();
    echo session_status();

    session_name("second");
    session_start();
    echo session_status();
    session_destroy();
    echo session_status();
?>

我在 xampp 上对其进行了测试,它返回值 2121 表示会话处于活动状态,不存在,会话处于活动状态,不存在。

我将 session_name() 放在 session_start() 之前,因为在会话开始后设置名称不会生效。我用谷歌搜索它,它必须对 session.auto_start 设置为“true”的 php.ini 文件做一些事情。

关于这个话题的解释和辩论可以在这里找到:http://php.net/manual/en/function.session-name.php - 检查 cmets。

已编辑:

再次查看您的编辑后,您基本上不会创建两个会话,而是只创建一个会话,并且它以随机名称“first”或“second”开头。您可以销毁会话,但 cookie 将保留。我已经在 xampp 上测试了你的代码,它确实做到了。首先,PHP 启动一个会话并存储一个时间值为“会话”的 cookie,在重新加载页面后,它将再次加载两个选项之一,但这一次它将现有的 cookie 时间更改为“N/A”。您应该寻找一种解决方案来在页面加载后清除您的域中的 cookie,如下所示:

<?php
    $session_name = rand(0,1) ? 'first' : 'second';
    session_name($session_name);
    session_start();

    deleteCookies($session_name);

    function deleteCookies($skip_this_one) {
        if (isset($_SERVER['HTTP_COOKIE'])) {
        $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
        foreach($cookies as $cookie) {
            $parts = explode('=', $cookie);
            $name = trim($parts[0]);
            if ($name == $skip_this_one) {
                //skip
            }else{
                setcookie($name, '', time()-1000);
                setcookie($name, '', time()-1000, '/');
            }
        }
    }
    //do something inside your session
    //when done, stop the session the way you want
    session_destroy();
}
?>

这将删除所有以前的 cookie 并保持当前会话打开。

这个解决方案是从这里重写的:how to delete all cookies of my website in php

希望这会有所帮助:)

【讨论】:

  • 阅读会话名称。
  • 那么您的问题可能已经在这里得到解答:stackoverflow.com/questions/10703721/…
  • 这是我问题的重点。对同一脚本中的 两个 不同会话执行此操作是行不通的。它适用于一个会话。
  • 我已经为你测试了一些代码并编辑了我的帖子。希望它有所帮助:)
【解决方案2】:

请尝试以下代码

<?php unset($_SESSION['name']); // will delete just the name data
session_destroy(); // will delete ALL data associated with that user. 
?>

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2023-03-17
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多