session_destroy()没有记录我

时间:2017-12-03 09:08:17

标签: php session

每当我运行logout.php脚本,然后返回到一个没有登录保护的页面,它将让我仍然登录

logout.php

<?php

session_start(); 
session_unset();
session_destroy();
header("Location: ../index.php");
exit();
?>

的login.php

$userlogin = user_login($email, $password.$salt);
    if ($userlogin==false){
        $errors[]='Wrong email/password combination.';
    } else {
    //set the user session
        $_SESSION['UserId']=$userlogin;
        $_SESSION['LoginIP']=$_SERVER['REMOTE_ADDR'];
        $db->query("UPDATE users SET ipadd='".$_SERVER['REMOTE_ADDR']."' WHERE user_id=".$_SESSION['UserId']."");
        echo '<meta http-equiv="refresh" content="0; URL=index.php">';  

检查已登录的代码段

/* Check if user is logged in or not */
function loggedin(){
return (isset($_SESSION['UserId'])) ? true : false;
}
if (loggedin()==true){
$session_user_id = $_SESSION['UserId'];
$user_data = user_data($session_user_id,'full_name','username');
$rezult =$db->query("SELECT ipadd FROM users WHERE user_id=".$_SESSION['UserId']."");
while($rez = $rezult->fetch_assoc()){
    if  ($rez['ipadd']==$_SERVER['REMOTE_ADDR']) {
    } else {
    echo '<meta http-equiv="refresh" content="0; URL=logout2.php">';
    }

}
}

看过同样问题的帖子,但无论我尝试什么仍然得到同样的问题。任何建议都将非常感谢!

5 个答案:

答案 0 :(得分:1)

这是来自php.net http://php.net/manual/en/function.session-destroy.php 注意:您不必从通常的代码调用session_destroy()。清理$ _SESSION数组而不是销毁会话数据。

所以你只需要$ _SESSION = null,并且应该注销。

答案 1 :(得分:0)

我认为在你的index.php文件中应该有这些行:

if(!isset($_SESSION["session_name"])){
     header("Location: somewhere_mainpage.php");
}

最好让所有页面都有这些行。如果没有会话开始,这些行将把标题发送到另一个页面。

答案 2 :(得分:0)

<?php
session_unset();
session_destroy();
header("Location: ../index.php");
?>

应该可以使用,否则你可以取消设置值

<?php
unset($_SESSION['UserId']);  // Unsets the UserId Variable reuse for each variable 
session_destroy();
header("Location: ../index.php");
?>
你尝试过session_destroy()吗?

我也不确定你在关闭会话时是否需要session_start(),从内存中你只需要它来启动会话

答案 3 :(得分:0)

我相信当用户登录数据正确时,session_start();函数调用应该在您的登录页面上,并且在您的注销PHP代码中,您应该设置

session_destroy();unset($_SESSION['UserId'];

Logout.php:

 <?php
    session_destroy();
    /* * OR * */
    //unset($_SESSION['UserId'];
    header("Location: ../index.php");
    exit();
    ?>

答案 4 :(得分:-1)

我总是想破坏服务器会话和客户端cookie,尝试在出现任何错误时手动覆盖所有选项。

您可以使用以下命令破坏PHP中的cookie:

Vertex | value | type_undir_1_any | type_undir_2_any
Alice  | 1     | 0.2              |  0

setcookie(session_name(), '', time() - 3600, $cookie_path, $cookie_domain, $cookie_secure, $cookie_httponly ); <?php $cookie_path = "..."; $cookie_domain = "..."; $cookie_secure = "..."; $cookie_httponly = "..."; session_start(); session_unset(); session_destroy(); setcookie(session_name(), '', time() - 3600, $cookie_path, $cookie_domain,$cookie_secure, $cookie_httponly ); header("Location: ../index.php"); exit(); 使cookie在当前时间之前到期,这使得它无效。

调查的另一个选项是您的退出页面上的time() - 3600。一些参考页面如下:

php.net - session-regenerate-id

https://stackoverflow.com/a/22965580/1246494