在网站或应用开发过程中,常常需要确保用户账号只能在一个设备上登录,防止账号被多人同时使用。实现单用户登录限制不仅能保障账户安全,也能有效管理用户会话。本文将结合具体代码示例,介绍如何用PHP完成这一功能。
首先,需要设计一张用于存储用户会话信息的数据表。可以创建一个名为 user_sessions 的表,存放用户ID、会话ID及登录时间。表结构设计示例如下:
CREATE TABLE user_sessions (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
session_id VARCHAR(255) NOT NULL,
login_time TIMESTAMP NOT NULL
);
以下是实现单用户登录限制的核心思路:
示例PHP代码如下:
<?php
session_start();
// 连接数据库
$dsn = 'mysql:host=localhost;dbname=your_database';
$username = 'your_username';
$password = 'your_password';
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
try {
$dbh = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
echo '数据库连接失败: ' . $e->getMessage();
exit();
}
// 用户登录
function login($user_id) {
global $dbh;
$session_id = session_id();
$login_time = date('Y-m-d H:i:s');
$stmt = $dbh->prepare('INSERT INTO user_sessions (user_id, session_id, login_time) VALUES (?, ?, ?)');
$stmt->execute([$user_id, $session_id, $login_time]);
}
// 检查用户登录状态
function check_login($user_id) {
global $dbh;
$session_id = session_id();
$stmt = $dbh->prepare('SELECT * FROM user_sessions WHERE user_id = ? ORDER BY login_time DESC LIMIT 1');
$stmt->execute([$user_id]);
$row = $stmt->fetch();
if ($row['session_id'] != $session_id) {
header('Location: login.php'); // 跳转至登录页面
exit();
}
}
// 用户注销
function logout($user_id) {
global $dbh;
$stmt = $dbh->prepare('DELETE FROM user_sessions WHERE user_id = ?');
$stmt->execute([$user_id]);
}
// 使用示例
$user_id = 1;
if (isset($_SESSION['user_id'])) {
check_login($_SESSION['user_id']);
} else {
login($user_id);
}
// 其他操作
// ...
// 用户注销
// logout($user_id);
?>
通过以上数据库设计和PHP代码示例,开发者可以实现基本的单用户登录限制功能,确保用户账号在同一时间内只能在一个设备上使用。根据项目实际需求,可进一步扩展和完善相关逻辑。