如何使用MySQL和PHP在数据库中为每次登录存储用户的注销时间?
我不熟悉PHP和MySQL。我的项目是关于一个学校管理系统。在这个项目中,我有3个用户。无论何时登录,每次都会正确存储登录时间。当用户注销时,会存储注销时间。问题是,该特定用户的上次注销时间也会更新为以前的注销时间。先谢谢你 我的代码是: login.php如何使用MySQL和PHP在数据库中为每次登录存储用户的注销时间?,php,mysql,Php,Mysql,我不熟悉PHP和MySQL。我的项目是关于一个学校管理系统。在这个项目中,我有3个用户。无论何时登录,每次都会正确存储登录时间。当用户注销时,会存储注销时间。问题是,该特定用户的上次注销时间也会更新为以前的注销时间。先谢谢你 我的代码是: login.php $sql = $conn->query("Insert into userlog (username) values ('$username')"); 注销。php <?php include("php/dbconnect.
$sql = $conn->query("Insert into userlog (username) values ('$username')");
注销。php
<?php
include("php/dbconnect.php");
ob_start();
mysqli_query($conn,"UPDATE userlog SET logoutTime = NOW() WHERE username = '$_SESSION[username]' ");
unset($_SESSION['name']);
unset($_SESSION['uid']);
unset($_SESSION['username']);
echo '<script type="text/javascript">window.location="login.php"; </script>';
?>
但我的输出如下所示
id username login logout
1 1111 12:10 12:50
2 1111 12:40 12:50
您需要确保只更新最新的登录时间,因此在WHERE子句中添加一个条件:
mysqli_query($conn,"UPDATE userlog
SET logoutTime = NOW()
WHERE username = '$_SESSION[username]'
AND loginTime = (SELECT maxLoginTime
FROM (SELECT MAX(loginTime) AS maxLoginTime
FROM userlog
WHERE username = '$_SESSION[username]') u)"
);
您需要确保只更新最新的登录时间,因此在WHERE子句中添加一个条件:
mysqli_query($conn,"UPDATE userlog
SET logoutTime = NOW()
WHERE username = '$_SESSION[username]'
AND loginTime = (SELECT maxLoginTime
FROM (SELECT MAX(loginTime) AS maxLoginTime
FROM userlog
WHERE username = '$_SESSION[username]') u)"
);
使用查询后,注销时间为0000:00:00。它不给任何好处response@K.Kishore很抱歉,我忘记添加子查询层来解决“无法从正在更新的表中选择”错误。请再试一次。注意,我添加了一个演示来演示如何在dbfiddle上进行查询。谢谢!它工作得很好。输出非常好。但我有一个疑问,你用了一个术语“u”。这是什么?@K.Kishore当您使用派生表时,即FROM子句中的子查询,您必须为该表指定一个名称,例如SELECT。。。从…起作为名字。AS是可选的。在本例中,我将表命名为u,它实际上与名称无关,因此我只选择了主表名称的第一个字母。要了解更多信息,请尝试在Google上搜索每个派生表必须有一个别名@Nickafter,使用您的查询注销时间为0000:00:00。它不给任何好处response@K.Kishore很抱歉,我忘记添加子查询层来解决“无法从正在更新的表中选择”错误。请再试一次。注意,我添加了一个演示来演示如何在dbfiddle上进行查询。谢谢!它工作得很好。输出非常好。但我有一个疑问,你用了一个术语“u”。这是什么?@K.Kishore当您使用派生表时,即FROM子句中的子查询,您必须为该表指定一个名称,例如SELECT。。。从…起作为名字。AS是可选的。在本例中,我将表命名为u,它实际上与名称无关,因此我只选择了主表名称的第一个字母。要了解更多信息,请尝试用谷歌搜索每个派生表必须有一个别名。非常感谢@NickHi,欢迎使用SO,祝贺您学习了一项新技能!此评论与您的问题无关,但我必须向您提供重要信息!您的示例代码显示了一个漏洞。你应该尽快了解!您好,欢迎来到SO,祝贺您学习了一项新技能!此评论与您的问题无关,但我必须向您提供重要信息!您的示例代码显示了一个漏洞。你应该尽快了解!