PHP - 管理会话 - 不注销

时间:2014-06-25 04:55:13

标签: php session login logout

我创建了一个带有必要的数据库表和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等

4 个答案:

答案 0 :(得分:2)

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

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

对于完全破坏力,您可能还想要终止会话cookie:

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

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

答案 1 :(得分:1)

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

此外,您应该使用字符串引用$row变量中的键。例如$row['username'];

使用E_NOTICE打开error_reporting级警告可以帮助您解决此问题。

答案 2 :(得分:0)

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

unset($_SESSION['logged']); 

或者只是将其更改为false

$_SESSION['logged'] = false;

答案 3 :(得分:0)

当你第一次直接点击地址栏中的页面时,它会向服务器和服务器发送一个新请求,检查代码中写入的现有会话。但是在退出后按回按钮时不一样。在这种情况下,没有请求进入服务器,而是从浏览器缓存中获取请求。如果要禁用此情况,则必须明确告诉浏览器不要将页面存储在缓存中。有关详细信息,请参阅此link