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