我的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
之前以任何其他方式销毁。
答案 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,它实际上会删除整个会话。