14

我的 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.

4

7 回答 7

38

您必须在注销类中的注销功能顶部调用下面提到的功能。

session_start();

加上上面的函数,试试看。如果您没有在文件顶部启动会话,它将引发“标头已发送”、“无法启动会话”等异常。

于 2013-08-12T13:59:21.240 回答
14

当您没有事先启动会话时,此错误很常见

if (!isset($_SESSION))
  {
    session_start();
  }
于 2013-08-12T13:56:12.077 回答
5

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

if (session_status() === PHP_SESSION_ACTIVE)
        session_destroy();
于 2021-01-29T17:13:48.510 回答
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 >= 5.4 中,它应该可以替换if (self::$haveSession)if(session_status() === PHP_SESSION_ACTIVE).

于 2014-07-22T21:06:18.583 回答
1

如果之前没有启动,您可以添加此代码来启动会话

if(!session_id()) {
    session_start();
}
于 2018-09-11T22:21:38.213 回答
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();
        }   
    }

?>
于 2013-08-12T13:53:40.017 回答
0

在调用 session_destroy() 之前,您必须先调用 session_start();

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

于 2014-05-05T10:18:55.490 回答