问题解释
我创建了第一个会话的登录信息。 基本上我有3个输入,2个字段,一个提交。
第一个字段是用户名,第二个字段是密码。
然后我使用PDO从用户表中选择用户名,密码WHERE = username,以验证详细信息。
然后我计算行数,看是否有一行指定用户名&密码。
很好,我现在已登录..
但是有问题 ..当我从数据库中删除用户时,我可以继续使用同一个用户在我的系统中浏览,直到会话结束或我退出。
问题
如何立即检查用户是否仍在数据库中? 每次用户进入新页面或刷新时,最好的方法是什么?
谢谢!
创建会话的代码(登录验证):
# Selecting the entered username + password from our admins database & making sure field
# with that specify username and password exists.
$hashed = hash('sha512', md5($password));
$check = $CONNECT_TO_DATABASE->prepare("SELECT * FROM admin WHERE username = :username AND password = :password LIMIT 1");
$check->bindValue(':username', $username);
$check->bindValue(':password', $hashed);
$check->execute();
# We check if that row exists, if it exists - We will create a new session with that entered
# username, that means administrator has sucessfuly logged in.
if ($check->rowCount()) {
$_SESSION['user'] = $username;
header ('Location: index.php');
} else {
# If login failed, because the details are wrong, we will store the error message into
# our errors array and then use a loop to fetch the error.
if (!empty($username) && !empty($password)) {
$errors[] = 'Wrong username or password.';
}
}
然后我用它来查看用户是否已登录:
if (isset($_SESSION['user'])) {
答案 0 :(得分:2)
您必须编写一个将在每个页面上运行的检查算法。此算法将在数据库中执行查询以检查用户是否仍然存在(请记住,您不能信任用户输入,会话就是这样)。如果查询结果为否定,则您将调用session_destroy()
。
根据您所遵循的应用程序设计和模式,您可以在所有页面中包含validate.php
文件,也可以在控制器的构造函数中调用特定的AuthHelper
类,以便为您执行此操作。< / p>
我会更多地强调这一点:你不能信任会话,因为他们是用户输入。 将自动检查用户是否存在的解决方案是以下算法:
答案 1 :(得分:1)
您确实将userinfo传递并存储到会话,以便您可以使用存储的$_SESSION
个变量。
然后使用SELECT
语句执行数据库以检查存储的用户是否在
会话如果仍在您的数据库上,那么如果没有执行条件来销毁会话和
注销它们。
例如
$sql='SELECT * FROM USERS WHERE ID='.$_SESSION['user_id'].'';
$result = mysql_query($sql);
if(count($result)>0){
echo 'User at database';
}
else{
echo 'User not at database';
session_destroy();
// then redirect to homepage or login page.
}
答案 2 :(得分:1)
如果这是一个问题,请不要使用会话。听起来每次执行操作以验证用户是否仍然存在时都需要检查数据库,因此您每次都可以提取数据。这可能会引发一个关于加载的争论,但你可以缓存需要缓存的东西并重新拉动关键部分并验证其他部分。
如果您需要扩展,这也可以帮助您,因此您不必担心会话持久性。