【发布时间】:2017-01-03 03:26:19
【问题描述】:
在我的网站上,有一个登录和注销的功能。登录时,我设置了会话变量 pass(这是散列密码),uid 是登录用户的 ID,loggedIn(布尔值):
$hashedpass = **hashed pass**;
$_SESSION['pass'] = $hashedpass or die("Fel 2");
$_SESSION['uid'] = $uid or die("Fel 3");
$_SESSION['loggedIn'] = true or die("Fel 4");
header("Location:indexloggedin.php");
在每个页面上,我都会检查访问者是否登录
- 检查
$_SESSION['loggedIn']的状态, - 在数据库中搜索 ID 为
$_SESSION['uid']的用户, -
检查数据库中的哈希密码是否与会话变量中的哈希密码匹配:
$sespass = $_SESSION['pass']; $sesid = $_SESSION['uid']; $sql2 = "SELECT * FROM `users` WHERE `id` = '$sesid'"; $result2 = mysqli_query($db_conx, $sql2); $numrows2 = mysqli_num_rows($result2); if ($numrows2 != 1) { $userOk = false; } while ($row = mysqli_fetch_array($result2,MYSQLI_ASSOC)) { $dbpass = $row['pass']; } if ($sespass != $dbpass) { $userOk = false; } else { $userOk = true; }
我的问题是这似乎在某些页面上有效,而在其他页面上无效。例如,当我登录时,我会立即登录到主页,但不会登录到个人资料页面。但是,在重新加载几次后,我也登录到了个人资料页面。注销时也会发生同样的事情。
出于测试目的,我尝试 var_dump 密码变量以及索引页面上的 userOk 状态,这就是我注意到一些有趣的地方。当我注销时,密码变量设置为空,$userOk 是false,根据index.php?msg=loggedout 显示的内容。但是当我删除?msg=loggedout(只留下index.php)时,密码变量恢复到以前的值,我不再注销……重新加载几次后,我再次注销。
为什么我的会话变量没有按预期工作?感觉好像他们需要时间来更新,这很奇怪。我尝试过禁用缓存(通过标题和浏览器中的缓存设置)。
如果您需要更多信息,请告诉我。
【问题讨论】:
-
只有您的代码存在一些问题...与我们分享整个页面
-
在将 id 或会话插入 db 之前始终使用 trim() 是一种很好的做法
-
session_start()在哪里? -
它在那些文件中,只是不在我在这里发布的内容中。 @CodeGodie
标签: php session session-variables