【问题标题】:PHP - Managing Session - Doesnt LogoutPHP - 管理会话 - 不注销
【发布时间】:2014-08-15 12:44:48
【问题描述】:

我已经用必要的数据库表和 php 创建了一个用户认证系统。

在我第一次登录之前(在创建任何 SESSION 之前)每个页面上的重定向都可以完美运行(即,如果未登录,则重定向到登录页面)。

但是,一旦我以用户身份登录然后注销,同样不起作用。我认为不结束 SESSION 可能是个问题(如果错了,请见谅)

这是每个页面中的一些代码

登录 PHP

    <?php
session_start();
$message="";
if(count($_POST)>0) 
{
    include('config.php');
    echo $_POST['username'];
    $result = mysql_query("SELECT * FROM members WHERE username='" . $_POST["username"] . "' and password = '". $_POST["password"]."'");
    $row  = mysql_fetch_array($result);
    if(is_array($row)) 
    {
    $_SESSION["id"] = $row[ID];
    $_SESSION["username"] = $row[username];
    $_SESSION["password"] = $row[password];
    $_SESSION["mname"] = $row[mname];
    $_SESSION["fname"] = $row[fname];
    date_default_timezone_set("Asia/Calcutta");
    $lastlog=date("d/m/Y");
    $logtime=date("h:i a");
    $query = "UPDATE `members` SET `lastlogin`='$lastlog',`logintime`='$logtime' WHERE `ID`='$row[ID]'"; 
    mysql_query($query);
    $_SESSION['logged'] = TRUE; 
    } 
    else 
    {
        echo "<SCRIPT>
        alert('Wrong Username/Password or Awaiting Approval');
        </SCRIPT>";
        header("Location:login_failed.html");
    }
}
if(isset($_SESSION["id"])) {
header("Location:member/myprofile.php");
}
?>

每一页都有PHP代码

<?php
session_start();
include('config.php');
if(!$_SESSION['logged'])
{
header("Location: ../login.html");
exit;
} ?>

最后退出

    <?php
session_start();
unset($_SESSION["id"]);
unset($_SESSION["username"]);
unset($_SESSION["password"]);
unset($_SESSION["mname"]);
unset($_SESSION["fname"]);
header("Location:../login.html");
?>

我的代码有什么问题吗?我错过了什么吗?我做错了。请帮忙

谢谢大家解决了..

现在你能告诉我如何在用户登录(会话存在)的情况下将 login.php 重定向到用户主页(myprofile.php) - 比如 facebook、gmail 等

【问题讨论】:

  • session_destroy();

标签: php session login logout


【解决方案1】:

您可以简单地使用session_destroy(),而不是在每个会话变量上调用unset(),这将销毁所有当前会话数据。

session_start();
session_destroy();
header("Location:../login.html");

为了获得完全的破坏力,您可能还想杀死会话 cookie:

setcookie(session_name(), '', 1);

有关会话注销的更完整示例,请参阅 this question

【讨论】:

  • 谢谢你的问题解决了......:-) 如果用户登录(会话存在),我如何将 login.php 重定向到用户主页(myprofile.php) - 像 facebook, gmail等
  • @user3765203 在login.php 的顶部,session_start() 的下方,放置if(isset($_SESSION['logged'])) header('Location: myprofile.php') 或类似的东西......更好的是,在代码on every page 上,添加,@987654330 @
  • 好的,我会这样做的。目前用于登录,我正在使用 login.html,然后通过 post 将值传递给 login.php.. 所以我应该将其更改为单页 login.php 以进行重定向.. 我不应该吗?
  • @user3765203 可能是的
  • 对不起,如果这听起来很愚蠢-但是一个人告诉我,如果我在登录页面中进行整个 php 编码,我很容易发生 SQL 注入...他建议使用这种方法.. 正确吗?
【解决方案2】:

您需要取消设置$_SESSION['logged']

您还应该使用字符串引用$row 变量中的键。比如$row['username'];

使用error_reporting 开启E_NOTICE 级别警告将帮助您解决此问题。

【讨论】:

    【解决方案3】:

    如果您还没有,请重置会话登录

    unset($_SESSION['logged']); 
    

    或者直接改成 false

    $_SESSION['logged'] = false;
    

    【讨论】:

      【解决方案4】:

      当您第一次直接点击地址栏中的页面时,它会发出一个新请求,该请求会发送到服务器,并且服务器会按照您的代码中所写的方式检查现有会话。但是,当您在注销后按返回按钮时,情况就不一样了。在这种情况下,没有请求发送到服务器,而是从浏览器缓存中获取请求。如果您想禁用这种情况,那么您必须明确告诉浏览器不要将您的页面存储在缓存中。更多详情请通过link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-26
        • 2014-09-12
        • 2017-07-01
        • 2018-11-25
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        • 2012-07-21
        相关资源
        最近更新 更多