警告:session_destroy():尝试销毁未初始化的会话

时间:2013-08-12 13:49:47

标签: php session

我的class.inc文件:

<?php
class logout{
    public function logout(){
        $_SESSION = array();
        if (ini_get("session.use_cookies")) {
            $params = session_get_cookie_params();
            setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params["httponly"]);
        }
        session_destroy();
    }   
}

?>

我的注销使用了代码:

session_start();
require($path."include/class.inc");
if(!empty($_GET['logout'])){
    $object=new logout();
    $object->logout();
    $content='5;url='.$path.'index.php';
}

当调用logout函数时,它会销毁会话,但会显示警告:

Warning: session_destroy(): Trying to destroy uninitialized session in class.inc on line 9

我无法排除故障,因为会话未在session_destroy() class.inc之前以任何其他方式销毁。

7 个答案:

答案 0 :(得分:31)

您必须在注销类的顶部退出函数中调用下面提到的函数。

session_start();

添加上述功能并试用。如果您没有在文件顶部启动会话,则会抛出“已发送的标头”,“无法启动会话”等异常。

答案 1 :(得分:12)

如果您未事先启动会话,则此错误很常见

if (!isset($_SESSION))
  {
    session_start();
  }

答案 2 :(得分:2)

当我开始使用session_destroy()时,我遇到了session_write_close()错误消息。要确定是否应该调用session_destroy(),我必须执行以下操作:

class Session {
    public static function start() {
        self::$haveSession = true;
        session_start();
    }
    public static function finish() {
        session_write_close();
        self::$haveSession = false;
    }
    public static function clear() {
        if (self::$haveSession) {
            session_unset();
            session_destroy();
        }
    }
}

在PHP&gt; = 5.4中,它应该可以用if (self::$haveSession)替换if(session_status() === PHP_SESSION_ACTIVE)

答案 3 :(得分:2)

https://www.php.net/manual/en/function.session-status.php

if (session_status() === PHP_SESSION_ACTIVE)
        session_destroy();

答案 4 :(得分:1)

您可以添加此代码以启动会话,前提是之前没有启动

if(!session_id()) {
    session_start();
}

答案 5 :(得分:0)

开始您的会话 session_start();,您可以销毁会话

    <?php
    session_start();
    class logout{
        public function logout(){
            $_SESSION = array();
            if (ini_get("session.use_cookies")) {
                $params = session_get_cookie_params();
                setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params["httponly"]);
            }
            session_destroy();
        }   
    }

?>

答案 6 :(得分:0)

在调用session_destroy();

之前,您必须调用session_start()

您是将会话存储在文件或数据库中的数据中吗?如果您将其存储在数据库中,我通常只是从会话表中删除与会话ID对应的记录,这样您就不必取消注册每个会话var,它实际上会删除整个会话。