php 实现签到
PHP 实现签到功能
数据库设计
创建一个用户签到表,包含用户ID、签到日期等字段。示例SQL:
CREATE TABLE user_check_in (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
check_in_date DATE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY (user_id, check_in_date)
);
签到逻辑实现
检查用户是否已签到,未签到则插入记录:

<?php
// 连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$userId = 1; // 当前用户ID
$today = date('Y-m-d');
// 检查是否已签到
$stmt = $pdo->prepare("SELECT id FROM user_check_in WHERE user_id = ? AND check_in_date = ?");
$stmt->execute([$userId, $today]);
if ($stmt->fetch()) {
echo "今日已签到";
} else {
// 执行签到
$insert = $pdo->prepare("INSERT INTO user_check_in (user_id, check_in_date) VALUES (?, ?)");
if ($insert->execute([$userId, $today])) {
echo "签到成功";
} else {
echo "签到失败";
}
}
?>
连续签到统计
查询用户最近连续签到天数:
// 查询连续签到天数
$stmt = $pdo->prepare("
SELECT COUNT(*) as consecutive_days
FROM (
SELECT check_in_date
FROM user_check_in
WHERE user_id = ?
ORDER BY check_in_date DESC
) t
WHERE check_in_date = DATE_SUB(CURDATE(), INTERVAL (SELECT COUNT(*) - 1) DAY)
");
$stmt->execute([$userId]);
$result = $stmt->fetch();
echo "连续签到: " . $result['consecutive_days'] . "天";
签到奖励系统
根据签到情况给予奖励:

// 根据连续签到天数发放奖励
$consecutiveDays = $result['consecutive_days'];
$reward = 0;
if ($consecutiveDays >= 7) {
$reward = 50;
} elseif ($consecutiveDays >= 3) {
$reward = 20;
} else {
$reward = 10;
}
// 更新用户积分
$update = $pdo->prepare("UPDATE users SET points = points + ? WHERE id = ?");
$update->execute([$reward, $userId]);
echo "获得奖励积分: " . $reward;
防止重复签到
在数据库层面设置唯一索引,确保用户每天只能签到一次:
ALTER TABLE user_check_in ADD UNIQUE INDEX idx_user_date (user_id, check_in_date);
签到日历展示
显示用户当月签到情况:
// 获取当月所有签到日期
$month = date('Y-m');
$stmt = $pdo->prepare("
SELECT check_in_date
FROM user_check_in
WHERE user_id = ?
AND check_in_date LIKE '$month%'
");
$stmt->execute([$userId]);
$signedDates = $stmt->fetchAll(PDO::FETCH_COLUMN);
// 生成日历HTML
echo "<div class='calendar'>";
for ($day = 1; $day <= date('t'); $day++) {
$date = $month . '-' . str_pad($day, 2, '0', STR_PAD_LEFT);
$signed = in_array($date, $signedDates) ? 'signed' : '';
echo "<span class='day $signed'>$day</span>";
}
echo "</div>";






