【问题标题】:I just can't destroy a session in php我只是无法在 php 中销毁会话
【发布时间】:2013-05-26 13:31:04
【问题描述】:

当我通过销毁会话注销并启动另一个会话时,它总是向我显示我启动的第一个会话信息 $_SESSION['username'];

我的意思是: 我第一次使用这个用户名登录时开始了一个会话 --> AAAAAA 并使用包含此代码的文件 logout.php 销毁会话:

session_start();
session_destroy();
header("location: login.php");

并使用另一个用户名登录 ---> BBBBBB 它总是显示我登录的第一个用户名---> AAAAAA

问题出在哪里

这里是代码(login.php)

<?php
        session_start();
        require_once "config/db.php";
        if(isset($_POST['login'])){     
        $username       = trim(mysql_real_escape_string($_POST['username']));
        $password       = trim(mysql_real_escape_string(md5($_POST['password']))); 
        $query          = mysql_query("SELECT * FROM `users` WHERE username='$username' AND password='$password' ")  or die(mysql_error());
         $rows           = mysql_num_rows($query);

        if($rows == 1){

            while($info = mysql_fetch_object($query)){            
                $dbusername = $info->username;
                $dbpassword = $info->password;
            }

            if($dbusername == $username && $dbpassword == $password){                   
                header("Location: index.php");         
                $_SESSION['username'] = $username;  
            }       

        }else{

        }
    }
?>

index.php:

  <?php session_start();?>
  <h3><?php echo $_SESSION['username']; ?></h3>

【问题讨论】:

  • 您是否在发送标头后设置会话?它永远不会被更新。替换那些行,它应该可以工作。另一件事,根据:php.net/manual/en/function.session-destroy.php,考虑也删除 session_id 的 cookie
  • 仅使用 MD5 散列密码是不够的。请改用 bcrypt。

标签: php


【解决方案1】:

来自docs

为了完全终止会话,比如注销用户, 会话 ID 也必须取消设置。如果使用 cookie 来传播 会话 id(默认行为),则会话 cookie 必须是 删除。 setcookie() 可以用于此。

Example:

session_unset();
session_destroy();
session_write_close();
setcookie(session_name(),'',0,'/');
session_regenerate_id(true);

【讨论】:

  • 我应该在这里做什么?我真的还是一个php新手,这是我的项目期末考试:(我是否必须用你刚刚给我的那个来更改注销文件代码。???
  • 添加到您的注销脚本: session_unset(); session_destroy(); session_write_close(); setcookie(session_name(),'',0,'/'); session_regenerate_id(true);然后将用户重定向到主页。
  • 我还在等呢:(
  • 我不知道。我尝试了您的解决方案但仍然无法正常工作..我只是发现当我清空 db 表中的所有数据时它总是将 $_SESSION 重定向到第一个共享文章的用户.. 请注意看看脚本我给你这里?拜托,这真的很紧急,没有足够的时间来完成这个项目......只要看看索引文件,看看我是否犯了任何错误,因为我真的陷入了这个问题,不知道是什么要做:(
【解决方案2】:

我同意 @Valery Viktorovsky 但是, 由于PHP 7,您在销毁会话后无法使用session_regenerate_id(true);...

更新日志HERE 说:

7.0.0 - session_regenerate_id() saves old session data before closing.

这个适用于 PHP 7 或更高版本:

ob_start();
session_start();
session_unset();
session_regenerate_id(true);
session_unset();
session_destroy();
session_write_close();
setcookie(session_name(),'',0,'/');
header('LOCATION: index.php');

如果你不想的话,你可以试试这个

【讨论】:

    【解决方案3】:

    这是我的例子:

    //Delete all previous PHPSESSID cookies
    $past = 60 * 60 * 24 * 365 * 10;
    setcookie('PHPSESSID', false, time() - $past);
    //Delete all the data in the $_SESSION
    $_SESSION = array();
    //Delete the old session file (true) and create a new session id
    session_regenerate_id(true);
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 2012-05-25
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多