php 实现 签到功能实现
数据库设计
创建一个签到表用于存储用户的签到记录,字段包括用户ID、签到日期、连续签到天数等。示例SQL如下:

CREATE TABLE `user_check_in` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`check_in_date` date NOT NULL,
`continuous_days` int(11) DEFAULT 1,
PRIMARY KEY (`id`),
UNIQUE KEY `user_date` (`user_id`,`check_in_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
签到逻辑实现
通过PHP判断用户当日是否已签到,未签到则插入记录并更新连续签到天数。示例代码:

function checkIn($userId) {
$today = date('Y-m-d');
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 检查今日是否已签到
$stmt = $pdo->prepare("SELECT * FROM user_check_in WHERE user_id = ? AND check_in_date = ?");
$stmt->execute([$userId, $today]);
if ($stmt->fetch()) {
return ['status' => 'error', 'message' => '今日已签到'];
}
// 获取昨日签到记录
$yesterday = date('Y-m-d', strtotime('-1 day'));
$stmt = $pdo->prepare("SELECT * FROM user_check_in WHERE user_id = ? AND check_in_date = ?");
$stmt->execute([$userId, $yesterday]);
$lastRecord = $stmt->fetch();
// 计算连续签到天数
$continuousDays = $lastRecord ? $lastRecord['continuous_days'] + 1 : 1;
// 插入签到记录
$stmt = $pdo->prepare("INSERT INTO user_check_in (user_id, check_in_date, continuous_days) VALUES (?, ?, ?)");
$stmt->execute([$userId, $today, $continuousDays]);
return ['status' => 'success', 'continuous_days' => $continuousDays];
}
奖励机制
根据连续签到天数发放不同奖励,可在签到成功后调用奖励函数:
function giveReward($userId, $continuousDays) {
$rewards = [
3 => ['type' => 'points', 'amount' => 10],
7 => ['type' => 'points', 'amount' => 30],
30 => ['type' => 'vip', 'days' => 1]
];
if (isset($rewards[$continuousDays])) {
$reward = $rewards[$continuousDays];
// 实现发放奖励逻辑
return $reward;
}
return null;
}
签到统计
提供查询用户签到情况的接口:
function getCheckInStats($userId) {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 当月签到记录
$stmt = $pdo->prepare("SELECT check_in_date FROM user_check_in
WHERE user_id = ? AND MONTH(check_in_date) = MONTH(CURRENT_DATE())");
$stmt->execute([$userId]);
$dates = $stmt->fetchAll(PDO::FETCH_COLUMN);
// 连续签到天数
$stmt = $pdo->prepare("SELECT continuous_days FROM user_check_in
WHERE user_id = ? ORDER BY check_in_date DESC LIMIT 1");
$stmt->execute([$userId]);
$continuousDays = $stmt->fetchColumn();
return [
'checked_dates' => $dates,
'continuous_days' => $continuousDays ?: 0
];
}
安全考虑
- 对用户输入进行验证和过滤
- 使用预处理语句防止SQL注入
- 重要操作记录日志
- 考虑添加每日签到限制






