php 签到功能实现
PHP 签到功能实现
数据库设计
创建一个用户签到表,包含用户ID、签到日期和连续签到天数等字段:
CREATE TABLE user_checkin (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
checkin_date DATE NOT NULL,
consecutive_days INT DEFAULT 1,
UNIQUE KEY (user_id, checkin_date)
);
基础签到逻辑
检查用户是否已签到,未签到则插入记录:

function checkIn($userId) {
$today = date('Y-m-d');
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
// 检查今日是否已签到
$stmt = $pdo->prepare("SELECT 1 FROM user_checkin WHERE user_id = ? AND checkin_date = ?");
$stmt->execute([$userId, $today]);
if ($stmt->fetch()) {
return ['status' => 'error', 'message' => '今日已签到'];
}
// 获取昨日签到记录
$yesterday = date('Y-m-d', strtotime('-1 day'));
$stmt = $pdo->prepare("SELECT consecutive_days FROM user_checkin WHERE user_id = ? AND checkin_date = ?");
$stmt->execute([$userId, $yesterday]);
$lastRecord = $stmt->fetch();
$consecutiveDays = $lastRecord ? $lastRecord['consecutive_days'] + 1 : 1;
// 插入签到记录
$stmt = $pdo->prepare("INSERT INTO user_checkin (user_id, checkin_date, consecutive_days) VALUES (?, ?, ?)");
$stmt->execute([$userId, $today, $consecutiveDays]);
return ['status' => 'success', 'consecutive_days' => $consecutiveDays];
}
连续签到奖励
根据连续签到天数给予不同奖励:

function getReward($consecutiveDays) {
$rewards = [
3 => ['points' => 10, 'name' => '三日礼包'],
7 => ['points' => 30, 'name' => '七日礼包'],
30 => ['points' => 100, 'name' => '月礼包']
];
return $rewards[$consecutiveDays] ?? ['points' => 1, 'name' => '每日签到'];
}
签到统计功能
获取用户本月签到情况:
function getMonthlyCheckins($userId) {
$firstDay = date('Y-m-01');
$lastDay = date('Y-m-t');
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$stmt = $pdo->prepare("SELECT checkin_date FROM user_checkin
WHERE user_id = ? AND checkin_date BETWEEN ? AND ?");
$stmt->execute([$userId, $firstDay, $lastDay]);
return $stmt->fetchAll(PDO::FETCH_COLUMN);
}
前端调用示例
通过AJAX调用签到接口:
$('#checkin-btn').click(function() {
$.post('/api/checkin.php', {user_id: 123}, function(response) {
if (response.status === 'success') {
alert(`签到成功!连续签到${response.consecutive_days}天`);
} else {
alert(response.message);
}
});
});
安全注意事项
- 用户ID应从会话中获取,避免前端传递可伪造的ID
- 对数据库操作使用预处理语句防止SQL注入
- 重要操作应记录日志
- 考虑添加每日签到次数限制
性能优化建议
- 为user_id和checkin_date字段添加复合索引
- 对高频访问的签到数据可考虑缓存
- 批量查询时使用WHERE IN替代多次单条查询






