我有一个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');
?>
我怎样才能做到这一点??
您可以删除所有饼干
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 名称,则应仅使用它们迭代循环。
问题是完全从网站注销用户,而不仅仅是如何销毁 PHP 会话,所以我的答案会稍微复杂一些。
由于您正在使用 PHP 的$_SESSION
功能来处理用户会话,因此您特别可以将当前会话 ID 绑定到用户帐户。然后,您可以轻松地强制会话过期。
例如,在用户数据库中创建一个新字段,并调用它active_session_id
或其他东西。每次用户登录时,将session_id()
输出保存到其中。然后在loggedin()
函数内部检查当前请求的session_id()
是否与用户登录时保存的匹配,如果不匹配,该函数将返回 false,因此这就是您虚拟结束用户会话的方式。也就是说,即使它实际上仍然存在,它也将不再有效。
值得注意的是,上面的解决方案将是一种one-to-one
关系,即一个用户只能有一个活动会话。如果你想允许用户同时来自不同的地方,你必须通过创建一个新的表来保持one-to-many
关系,例如。 users_sessions
并保存会话 ID。请不要在当前用户表中创建其他字段,如active_session_id_1
、active_session_id_2
等,因为这不被认为是一种好的做法。
希望这有帮助
您可以编写一个通用函数来检查用户是否已登录,如果不是像这样重定向他们
function isLoggedIn(){
if (isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])){
//do what you want
} else{
header("location:youloginpage.php");
}
}
如果你不在你的问题上指定更多,我们只能通过假设来推进。无论如何,由于您正在使用该会话,并且不清楚是否要销毁包含的数据,因此可以通过以下方式修改检查用户是否已登录的功能:
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
}
}