Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MySQL和PHP在数据库中为每次登录存储用户的注销时间?_Php_Mysql - Fatal编程技术网

如何使用MySQL和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.

我不熟悉PHP和MySQL。我的项目是关于一个学校管理系统。在这个项目中,我有3个用户。无论何时登录,每次都会正确存储登录时间。当用户注销时,会存储注销时间。问题是,该特定用户的上次注销时间也会更新为以前的注销时间。先谢谢你

我的代码是:

login.php

$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,祝贺您学习了一项新技能!此评论与您的问题无关,但我必须向您提供重要信息!您的示例代码显示了一个漏洞。你应该尽快了解!