php签到功能实现
PHP签到功能实现
数据库设计
创建一张用户签到表,包含以下字段:

id:自增主键user_id:用户IDsign_date:签到日期continuous_days:连续签到天数created_at:创建时间
CREATE TABLE `user_sign` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`sign_date` date NOT NULL,
`continuous_days` int(11) NOT NULL DEFAULT 1,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `user_date` (`user_id`,`sign_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
签到逻辑实现
检查用户是否已签到,未签到则插入记录并更新连续签到天数

function signIn($userId) {
$today = date('Y-m-d');
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 检查今日是否已签到
$stmt = $pdo->prepare("SELECT id FROM user_sign WHERE user_id = ? AND sign_date = ?");
$stmt->execute([$userId, $today]);
if ($stmt->fetch()) {
return ['status' => 0, 'msg' => '今日已签到'];
}
// 获取昨日签到记录
$yesterday = date('Y-m-d', strtotime('-1 day'));
$stmt = $pdo->prepare("SELECT continuous_days FROM user_sign WHERE user_id = ? AND sign_date = ?");
$stmt->execute([$userId, $yesterday]);
$continuousDays = $stmt->fetch() ? $stmt->fetch()['continuous_days'] + 1 : 1;
// 插入今日签到记录
$stmt = $pdo->prepare("INSERT INTO user_sign (user_id, sign_date, continuous_days) VALUES (?, ?, ?)");
$stmt->execute([$userId, $today, $continuousDays]);
return ['status' => 1, 'msg' => '签到成功', 'continuous_days' => $continuousDays];
}
签到统计功能
获取用户本月签到情况和连续签到天数
function getSignInfo($userId) {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$currentMonth = date('Y-m');
// 获取本月签到日期
$stmt = $pdo->prepare("SELECT sign_date FROM user_sign WHERE user_id = ? AND sign_date LIKE ?");
$stmt->execute([$userId, "$currentMonth%"]);
$signDates = $stmt->fetchAll(PDO::FETCH_COLUMN);
// 获取最近连续签到天数
$stmt = $pdo->prepare("SELECT continuous_days FROM user_sign WHERE user_id = ? ORDER BY sign_date DESC LIMIT 1");
$stmt->execute([$userId]);
$continuousDays = $stmt->fetch() ? $stmt->fetch()['continuous_days'] : 0;
return [
'sign_dates' => $signDates,
'continuous_days' => $continuousDays,
'current_month' => $currentMonth
];
}
前端展示示例
简单的HTML页面展示签到按钮和签到日历
<div class="sign-container">
<button id="signBtn" onclick="doSign()">立即签到</button>
<div id="signCalendar"></div>
</div>
<script>
function doSign() {
fetch('/sign.php?action=sign')
.then(response => response.json())
.then(data => {
if(data.status) {
alert('签到成功!连续签到' + data.continuous_days + '天');
location.reload();
} else {
alert(data.msg);
}
});
}
</script>
注意事项
- 数据库连接需要根据实际环境配置
- 建议添加事务处理保证数据一致性
- 重要操作建议记录日志
- 高并发场景需要考虑锁机制
- 签到奖励逻辑可根据业务需求扩展






