使用 php、pdo 和 mysql 显示当前登录用户的简单计数器

Posted

技术标签:

【中文标题】使用 php、pdo 和 mysql 显示当前登录用户的简单计数器【英文标题】:Display a simple counter of currently logged in users using php, pdo and mysql 【发布时间】:2014-02-24 13:50:47 【问题描述】:

我几天来一直在寻找这样一个非常简单的计数器,它可以在我的网站上显示许多当前登录的用户 - 但是,我没有找到任何东西。我发现的所有东西都与已弃用的 *mysql_functions.... 相关:( - 叹息...

我正在寻找的只是如何完成这项工作,因为我真的无法弄清楚这一点 - 人们会认为这很容易,但神圣的废话,在搜索和搜索之后,似乎有很多不同的方法可以完成遗憾的是,我发现的一切都是我上面提到的(使用已弃用的 mysql_functions 的东西)......

无论如何,这就是我想做的一切:

1.) 在我的users 表中添加lastactivitylastseen 或者基于时间戳或者可能基于默认值为0 的tinyint(1) 等于用户注销,如果用户已登录,该值将切换为1在...

2.) 根据我的数据库表users 中的内容,使用带有 PDO 驱动程序的 php 版本 (5.4.24) 为此创建一个类,它将更新并选择我的数据库表 users 中的内容,每 5- 10 分钟,将输出当前登录用户的数量。

3.) 能够使用<?php echo $lastactivity; ?><?php echo $lastseen; ?> 显示当前在每个页面上登录的用户数我将这段代码放在...

4.) 如果可能,所有这些都试图远离基于 SESSIONS...

如果有人能阐明如何实现这一点,我将不胜感激!

更新:

我的users 表中有什么:

lastseen | tinyint(1) | Default 0
lastactivity | timestamp | Default CURRENT_TIMESTAMP

我目前在我的users.php 课程页面中拥有的内容 - 我将展示我拥有的所有内容,因此请做好准备 - 还没有与登录用户计数器相关的内容,但是,与我所做的一样我是否希望能阐明如何添加我需要的内容...:

class Users 

    private $db;

    public function __construct($database) 
        $this->db = $database;
    

    public function update_user($clan_tag,
                    $gamer_tag,
                    $gender,
                    $day,
                    $month,
                    $year,
                    $location,
                    $occupation,
                    $interests,
                    $bio,
                    $status,
                    $xfire,
                    $steam,
                    $image_location,
                    $id) 

        $query = $this->db->prepare("UPDATE `users` SET
                                `clan_tag`      = ?,
                                `gamer_tag`     = ?,
                                `gender`        = ?,
                                `day`           = ?,
                                `month`         = ?,
                                `year`          = ?,
                                `location`      = ?,
                                `occupation`        = ?,
                                `interests`     = ?,
                                `bio`           = ?,
                                `status`        = ?,
                                `xfire`         = ?,
                                `steam`         = ?,
                                `image_location`    = ?

                                WHERE `id`      = ?");

        $query->bindValue(1, $clan_tag);
        $query->bindValue(2, $gamer_tag);
        $query->bindValue(3, $gender);
        $query->bindValue(4, $day);
        $query->bindValue(5, $month);
        $query->bindValue(6, $year);
        $query->bindValue(7, $location);
        $query->bindValue(8, $occupation);
        $query->bindValue(9, $interests);
        $query->bindValue(10, $bio);
        $query->bindValue(11, $status);
        $query->bindValue(12, $xfire);
        $query->bindValue(13, $steam);
        $query->bindValue(14, $image_location);
        $query->bindValue(15, $id);

        try
            $query->execute();
        catch(PDOException $e)
            die($e->getMessage());
        
    
    // update_status below has been duplicated from what is above to suit needs. Without this update, status update does not work in logster.php!
    public function update_status($status, $id)

        $query = $this->db->prepare("UPDATE `users` SET
                                `status`        = ?
                                WHERE `id`      = ?");

        $query->bindValue(1, $status);
        $query->bindValue(2, $id);

        try
            $query->execute();
        catch(PDOException $e)
            die($e->getMessage());
        
    

    public function change_password($user_id, $password) 

        global $bcrypt;

        $password_hash = $bcrypt->genHash($password);

        $query = $this->db->prepare("UPDATE `users` SET `password` = ? WHERE `id` = ?");

        $query->bindValue(1, $password_hash);
        $query->bindValue(2, $user_id);

        try
            $query->execute();
            return true;
         catch(PDOException $e)
            die($e->getMessage());
        
    


        public function fetch_info($what, $field, $value)
        /* (Add more here if new columns/rows are added to table) */
        $allowed = array('id',
                 'username',
                 'clan_tag',
                 'gamer_tag',
                 'gender',
                 'day',
                 'month',
                 'year',
                 'location',
                 'occupation',
                 'interests',
                 'bio',
                 'status',
                 'xfire',
                 'steam',
                 'email');

        if (!in_array($what, $allowed, true) || !in_array($field, $allowed, true)) 
            throw new InvalidArgumentException;
        else

            $query = $this->db->prepare("SELECT $what FROM `users` WHERE $field = ?");

            $query->bindValue(1, $value);

            try

                $query->execute();

             catch(PDOException $e)

                die($e->getMessage());
            

            return $query->fetchColumn();
        
    


    public function user_exists($username) 

        $query = $this->db->prepare("SELECT COUNT(`id`) FROM `users` WHERE `username`= ?");
        $query->bindValue(1, $username);

        try

            $query->execute();
            $rows = $query->fetchColumn();

            if($rows == 1)
                return true;
            else
                return false;
            

         catch (PDOException $e)
            die($e->getMessage());
        
    

    public function login($username, $password) 

        global $bcrypt;

        $query = $this->db->prepare("SELECT `password`, `id` FROM `users` WHERE `username` = ?");
        $query->bindValue(1, $username);

        try

            $query->execute();
            $data               = $query->fetch();
            $stored_password        = $data['password'];
            $id                 = $data['id'];

            if($bcrypt->verify($password, $stored_password) === true)
                return $id;
            else
                return false;
            

        catch(PDOException $e)
            die($e->getMessage());
        
    

    public function userdata($id) 

        $query = $this->db->prepare("SELECT * FROM `users` WHERE `id`= ?");
        $query->bindValue(1, $id);

        try

            $query->execute();

            return $query->fetch();

         catch(PDOException $e)

            die($e->getMessage());
        
    

    public function get_users() 

        $query = $this->db->prepare("SELECT * FROM `users` ORDER BY `time` DESC");

        try
            $query->execute();
        catch(PDOException $e)
            die($e->getMessage());
        

        return $query->fetchAll();
    

每个页面将包含哪些内容以显示当前登录用户的数量:

<?php echo $lastseen; ?><?php echo $lastactivity; ?>

更新 2:

包括我的注销功能:

class General
        // Note: Created to specify what logged in users can see/view and edit/update
    public function logged_in () 
        return(isset($_SESSION['id'])) ? true : false;
    
        // Note: Created to specify what a specific individual or user can see/view and edit/update
    public function logged_in_protect() 
        if ($this->logged_in() === true) 
                header('Location: home.php');
            exit();
        
    
        // Note: Created to specify what non-users - (those who are not logged in and/or do not have an account) can see/view only - (edit/update is unavailable)
    public function logged_out_protect() 
        if ($this->logged_in() === false) 
            header('Location: index.php');
            exit();
        
    

更新 3:

session_start();
session_destroy();
header('Location:index.php');

【问题讨论】:

您不需要会话来执行此操作。您可以基于以下几点:mysqli_query($db,"UPDATE table_name SET counter=counter+$value WHERE column='the_column'"); - $value 是您要设置的变量。 如果我不使用 mysqli 而是使用 pdo/mysql 的准备好的语句,我将如何做到这一点? 查询就是查询。您可以省略 mysqli 部分并使用标准 SQL 语法。即:"UPDATE table_name SET counter=counter+$value WHERE column='the_column'" 并使用您自己的 API。 如果我听起来非常笨,我很抱歉,但我是 php。基于该语法,如果我在我的users 表中总共创建了两列标题为:lastseen,它的时间戳默认为 current_timestamp,另一个是 lastactivity,其 tinyint(1) 默认为 0,我将如何处理创建事物的 php 方面以根据我的表中的内容创建当前登录用户的计数器?我真的迷路了......我读过的所有内容都与准备好的陈述或 pdo 无关...... 思考.......(给我一分钟左右);-) 【参考方案1】:

    我们将列称为“loggedIn”,而不是“lastseen”。这样,布尔值 0 或 1 就有意义了。扩展您现有的登录功能,将登录从 0 更改为 1:

    if($bcrypt->verify($password, $stored_password) === true)
            return $id;
    //update database
    $query = $this->db->prepare("UPDATE `users` SET `loggedIn` = `1` 
                                 WHERE `username` = ?");
    $query->bindValue(1, $username);
    $query->execute();
    
        else
            return false;
        
    

显然,您需要在注销函数中使用类似的语句将值设置回 0。

2 & 3。然后您可以将其添加为 Users 类的附加功能:

public function usersLoggedIn() 
    $query = $this->db->prepare("SELECT COUNT(*) AS loggedInCount FROM users 
                                 WHERE loggedIn = 1");
    try 
        $query->execute();

        while ($row = $query->fetch())    
            $loggedIn = $row['loggedInCount'];
        
        return $loggedIn;

     catch(PDOException $e) 
        die($e->getMessage());
    

【讨论】:

我仍然对这将如何工作感到困惑......一旦用户登录和退出显示正确数量的登录用户而没有时间间隔,表格是否会自动更新?此外,我将再次更新我的帖子以包含我的注销功能...请参阅上面关于 UPDATE 2 的原始帖子。 我在更新 2 中看到的内容与注销功能有关,但与注销功能本身无关。通常你会看到类似的东西: 我在更新 2 中看到的内容与注销功能有关,但与注销功能本身无关。通常你会看到类似: $_SESSION = array();这是清空 SESSION 数组的快速方法。但是,是的,该表将在登录和注销时自动更新。如果您能找到该注销功能,那将有所帮助。您如何处理会话也很重要,因为这可能会提供一种更简单的方法来计算谁登录了。 好的,我在原帖底部添加了UPDATE 3。这就是我的注销... 好的,所以在您的注销功能中,您将添加一个 sn-p 来更新数据库并将loggedIn 字段设置为0。 //更新数据库 $query = $this->db->prepare (“更新users设置loggedIn=0哪里username=?”); $query->bindValue(1, $username); $query->execute();

以上是关于使用 php、pdo 和 mysql 显示当前登录用户的简单计数器的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP/PDO 将大型 MySQL 表导出为 CSV

在 XAMPP 中创建数据库(MySQL PDO)并将其与 php 代码连接

如何使用 PHP 和 MySQL 创建 JSON 嵌套子父树(PDO 方法)

PHP使用pdo连接access数据库并循环显示数据操作示例

数据库抽象层PDO 1

php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例