错误 - session_destroy() - 尝试销毁未初始化的会话

时间:2013-08-31 17:41:46

标签: php session

我在PHP代码中使用session_destroy()收到错误。

以下脚本在每个页面上,如果用户已登录,则会检查会话是否有效,如果不是,则终止会话。

session_start();

// check for users already signed in and check session
if (isset($_SESSION['user_id'])) {
    $uid = $_SESSION['user_id'];

    // check user_id is a valid id
    if (!is_numeric($uid) || $uid < 0) {
        session_unset();
        session_destroy();
        session_regenerate_id(true);
    }

    // if user agent is different, kill session
    if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']) {
        session_unset();
        session_destroy();
        session_regenerate_id(true);
    }

    // if user's last login record fails to match session_id, kill session
    $SQL = "SELECT user_session FROM users_logins ";
    $SQL .= "WHERE user_id = :user_id ";
    $SQL .= "ORDER BY time_in DESC LIMIT 1;";
    $STH = $DBH_P->prepare($SQL);
    $STH->bindParam(':user_id', $uid);
    $STH->execute();
    $row = $STH->fetch();
    if ($STH->rowCount() > 0) {
        $db_sid = $row['user_session'];
    }
    if ($db_sid !== session_id()) {
        session_unset();
        session_destroy();
        session_regenerate_id(true);
    }
}

我收到的错误表示失败来自上次session_destroy()电话。

我是否正确使用session_destroy()?我在这里已经阅读了其他问题,但是大多数答案都建议在销毁之前必须使用session_start(),但是在检查开始之前我已经在顶部开始了会话。

1 个答案:

答案 0 :(得分:1)

你在那里做了一些疯狂的事情(但是你需要与你自己谈判,我不会在我的回答中讨论它),你看错误信息的原因很简单:

 session_regenerate_id(true);

命令PHP销毁旧会话。问题是,你已经这样做了,先前一行:

 session_destroy();
 session_regenerate_id(true);

所以从上面看一下。没有理由以OCD方式在你的会话处理中抛出尽可能多的函数(但实际上并不理解/不熟悉)。相反,如果你想在那里放置一些安全网,那么可以使用一个用于完成工作的函数并实际处理它的返回值。那会更有帮助。