使用 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
表中添加lastactivity
或lastseen
或者基于时间戳或者可能基于默认值为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 显示当前登录用户的简单计数器的主要内容,如果未能解决你的问题,请参考以下文章
在 XAMPP 中创建数据库(MySQL PDO)并将其与 php 代码连接
如何使用 PHP 和 MySQL 创建 JSON 嵌套子父树(PDO 方法)