php实现打卡系统
数据库设计
打卡系统需要存储用户打卡记录,设计简单的数据表结构:
- users表:存储用户信息
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); - checkins表:存储打卡记录
CREATE TABLE checkins ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, checkin_time DATETIME NOT NULL, location VARCHAR(100), FOREIGN KEY (user_id) REFERENCES users(id) );
用户认证
使用PHP实现基础登录验证:
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];
// 数据库查询验证(示例使用PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
header("Location: dashboard.php");
}
}
打卡功能实现
处理用户打卡请求并记录数据:
// 打卡处理逻辑
if (isset($_POST['checkin'])) {
$userId = $_SESSION['user_id'];
$location = $_POST['location']; // 可选:GPS或手动输入
$stmt = $pdo->prepare("INSERT INTO checkins (user_id, checkin_time, location)
VALUES (?, NOW(), ?)");
$stmt->execute([$userId, $location]);
echo "打卡成功!";
}
打卡记录查询
显示用户历史打卡记录:
$userId = $_SESSION['user_id'];
$stmt = $pdo->prepare("SELECT * FROM checkins WHERE user_id = ? ORDER BY checkin_time DESC");
$stmt->execute([$userId]);
$records = $stmt->fetchAll();
foreach ($records as $record) {
echo "时间:" . $record['checkin_time'] . ",地点:" . $record['location'] . "<br>";
}
防止重复打卡
添加当日唯一性检查:
$today = date('Y-m-d');
$stmt = $pdo->prepare("SELECT COUNT(*) FROM checkins
WHERE user_id = ? AND DATE(checkin_time) = ?");
$stmt->execute([$userId, $today]);
if ($stmt->fetchColumn() > 0) {
die("今日已打卡");
}
前端界面示例
基础HTML表单:
<form method="post">
<input type="text" name="location" placeholder="输入地点">
<button type="submit" name="checkin">打卡</button>
</form>
扩展功能建议
- 添加补卡申请功能
- 实现部门统计报表
- 集成微信/企业微信通知
- 添加人脸识别验证
- 使用Redis缓存高频查询数据
安全注意事项
- 对所有数据库查询使用预处理语句
- 密码存储使用
password_hash() - 重要操作需验证会话权限
- 生产环境应启用HTTPS
- 对用户输入进行过滤和转义







