php实现打卡
PHP实现打卡功能
打卡功能通常涉及用户登录、记录时间、存储数据等步骤。以下是一个简单的PHP打卡实现方案:
数据库设计
创建一张表存储打卡记录,例如:
CREATE TABLE `check_in` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`check_in_time` datetime NOT NULL,
`ip_address` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
用户认证
确保用户已登录才能打卡:
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
打卡处理逻辑
创建check_in.php处理打卡请求:

// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
// 防止重复打卡
$stmt = $db->prepare("SELECT * FROM check_in WHERE user_id = ? AND DATE(check_in_time) = CURDATE()");
$stmt->execute([$_SESSION['user_id']]);
if ($stmt->rowCount() > 0) {
die('今日已打卡');
}
// 记录打卡
$stmt = $db->prepare("INSERT INTO check_in (user_id, check_in_time, ip_address) VALUES (?, NOW(), ?)");
$stmt->execute([
$_SESSION['user_id'],
$_SERVER['REMOTE_ADDR']
]);
echo '打卡成功';
前端界面
简单的HTML打卡按钮:
<form action="check_in.php" method="post">
<button type="submit">每日打卡</button>
</form>
打卡记录查询
显示用户打卡历史:
$stmt = $db->prepare("SELECT * FROM check_in WHERE user_id = ? ORDER BY check_in_time DESC");
$stmt->execute([$_SESSION['user_id']]);
$records = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($records as $record) {
echo date('Y-m-d H:i', strtotime($record['check_in_time'])).'<br>';
}
安全增强
添加CSRF防护:

// 生成token
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// 表单中加入
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
// 验证token
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('非法请求');
}
扩展功能
-
连续打卡统计:
$stmt = $db->prepare(" SELECT COUNT(*) as days FROM check_in WHERE user_id = ? AND check_in_time >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) "); $stmt->execute([$_SESSION['user_id']]); $continuous = $stmt->fetchColumn(); -
打卡提醒功能:
$last_check = $db->query(" SELECT MAX(check_in_time) FROM check_in WHERE user_id = ".$_SESSION['user_id'] )->fetchColumn();
if (date('Y-m-d') > date('Y-m-d', strtotime($last_check))) { echo '今天尚未打卡'; }
3. 地理位置验证(可选):
```javascript
// 前端获取地理位置
navigator.geolocation.getCurrentPosition(function(position) {
// 将坐标发送到后端验证
});






