PHP注销和更新数据库

时间:2016-03-04 15:52:26

标签: php mysql pdo session-variables

我正在使用PHP / MySQL创建一个简单的Web应用程序,我想向用户显示如下内容;

`Last Login Time: Friday 4th of March at 2:25pm' 

我的users数据库具有以下结构;

+---------+-----------+-------------------+---------------------+
| user_id | user_name | user_email        | lastLogin           |
+---------+-----------+-------------------+---------------------+
| 1       | Joe       | joe@something.com | 0000-00-00 00:00:00 |
+---------+-----------+-------------------+---------------------+

最好的方法是什么?据推测,我在注销时更新lastLogin列?然后在用户下次登录时,我选择此列数据并显示它?

到目前为止我的代码如下;

(如果删除两条logout()行,$stmt函数的效果非常好。)

class.user.php

class USER {

    public function logout() {
        $stmt = $this->db->prepare("UPDATE users SET lastLogin = now()");
        $stmt->execute();
        session_destroy();
        unset($_SESSION['user_session']);
        return true;
    }

    public function lastLogin() {
        $stmt = $this->db->prepare("SELECT lastLogin FROM users WHERE user_name=:user_name");
        $stmt->bindparam(":user_name", $_SESSION['user_name']);
        $stmt->execute();

        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $date = date('jS M Y h:i', strtotime($row['lastLogin']));
        }
        return $date;
    }

}

logout.php

require_once('session.php');
require_once('class.user.php');
$user_logout = new USER();

if($user_logout->is_loggedin()!="")
{
    $user_logout->redirect('index.php');
}
if(isset($_GET['logout']) && $_GET['logout']=="true")
{      
    $user_logout->logout();
    $user_logout->redirect('index.php');
}

的index.php

<?php  echo '<p>Last Login ' .$USER->lastLogin();'</p>' ?>

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

  

最好的方法是什么?据推测,我在注销时更新了lastLogin列?

您无法强制用户退出,因此这种方法无效。

在注销时不要设置lastLogin,而是考虑在登录时设置它。您可以保留第二列actualLastLogin,以避免立即覆盖该值。

登录时,请执行:

UPDATE users
    SET lastLogin = NOW(),
    actualLastLogin = lastLogin
..

然后读取actualLastLogin的值。

可能的用户没有明确的登录时刻,因为您可能有一个持续会话的系统(例如&#34;记住我在这台计算机上#34;)。在这种情况下,您需要定义您认为会话的内容。如果您在1小时内处于非活动状态,那么会标记会话结束吗?它取决于你。

或者,您可以保留登录日志并返回最后一个。