1

我有一个PHP login注销脚本,我想要实现的是,当用户点击注销链接时,他完全注销,无论点击浏览器的后退按钮,并且不希望用户访问该页面.他们应该被重定向到login页面

这是登录功能

function loggedin() {
    if ( isset($_SESSION['user_id']) && !empty($_SESSION['user_id']) ) {
        return true;
    } else{
        return false;
    }
}

这是我的注销脚本

<?php
include 'includes/connect.php';
include 'includes/functions.php';

session_destroy();
header('location: index.php');

?>

我怎样才能做到这一点?

4

4 回答 4

2

问题是从网站上完全注销用户,而不仅仅是我如何销毁 PHP 会话,所以我的答案会更复杂一些。

由于您使用 PHP 的$_SESSION功能来处理用户会话,因此您尤其可以将当前会话 ID 与用户帐户联系起来。然后您可以轻松地强制会话过期。

例如,在用户数据库中新建一个字段,并调用它active_session_id什么的。每次用户登录时,将session_id()输出保存到其中。然后在您的loggedin()函数内部检查session_id()当前请求的 是否与用户登录时保存的请求匹配,如果不匹配,则该函数将返回 false,因此这就是您虚拟结束用户会话的方式。即,即使它实际上仍然存在,但它不再有效。

值得注意的是,上面的解决方案是一种one-to-one关系,即一个用户将只能拥有一个活动会话。如果您想允许用户同时来自不同的地方,您必须one-to-many通过创建一个名为 eg 的新表users_sessions并在那里保存会话 ID 来维护那里的关系。请不要在当前用户表中创建其他字段,例如等active_session_id_1active_session_id_2因为这不是一个好的做法。

希望这可以帮助

于 2013-05-05T10:10:17.767 回答
2

您可以删除所有 cookie

if (isset($_SERVER['HTTP_COOKIE'])) {
    $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
    foreach($cookies as $cookie) {
        $parts = explode('=', $cookie);
        $name = trim($parts[0]);
        setcookie($name, '', time()-1000);
        setcookie($name, '', time()-1000, '/');
    }
}

http://www.php.net/manual/en/function.setcookie.php#73484

如果您有一组用于登录身份验证的 cookie 名称,您应该只使用它们来迭代循环。

于 2013-05-05T09:34:35.997 回答
1

您可以编写一个通用函数来检查用户是否已登录,如果不只是像这样重定向他们

function isLoggedIn(){

    if (isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])){

        //do what you want

    } else{
        header("location:youloginpage.php");

    }
}
于 2013-05-05T09:25:45.517 回答
1

如果您没有详细说明您的问题,我们只能通过假设进行。无论如何,由于您正在使用该 SESSION,并且不清楚是否要销毁包含的数据,因此可以通过以下方式修改检查用户是否登录的功能:

function loggedin() {
    if ( isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id']) && ($_SESSION['user_id'] > 0) ) {
        return true; //user is logged in
        //other operations to be performed
    } else{
        return false; //user is NOT logged in
        //other operations to be performed
    }
}

注销功能可能是这样的:

function logout() {
    if ( isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id']) && ($_SESSION['user_id'] > 0) ) {
        $_SESSION['user_id'] = -1; //"unsets" the user, while not destroyng session
    } else{
        return false; //user is already logged out - do nothing
    }
}
于 2013-05-05T10:28:20.200 回答