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,
consecutive_days INT DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
检查是否已签到
查询数据库判断用户当天是否已签到:
function hasCheckedIn($userId) {
$today = date('Y-m-d');
$query = "SELECT COUNT(*) FROM user_check_in WHERE user_id = ? AND check_in_date = ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$userId, $today]);
return $stmt->fetchColumn() > 0;
}
处理签到逻辑
实现签到功能并更新连续签到天数:
function checkIn($userId) {
$today = date('Y-m-d');
$yesterday = date('Y-m-d', strtotime('-1 day'));
// 检查昨天是否签到
$query = "SELECT consecutive_days FROM user_check_in WHERE user_id = ? AND check_in_date = ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$userId, $yesterday]);
$lastConsecutiveDays = $stmt->fetchColumn();
$consecutiveDays = $lastConsecutiveDays ? $lastConsecutiveDays + 1 : 1;
// 插入签到记录
$query = "INSERT INTO user_check_in (user_id, check_in_date, consecutive_days) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($query);
$stmt->execute([$userId, $today, $consecutiveDays]);
return $consecutiveDays;
}
奖励机制
根据连续签到天数给予不同奖励:
function giveReward($userId, $consecutiveDays) {
$rewards = [
1 => 10, // 第1天奖励10积分
3 => 30, // 连续3天奖励30积分
7 => 100 // 连续7天奖励100积分
];
if (isset($rewards[$consecutiveDays])) {
$points = $rewards[$consecutiveDays];
// 更新用户积分逻辑
return $points;
}
return 0;
}
签到统计
获取用户签到统计信息:
function getCheckInStats($userId) {
$query = "SELECT
COUNT(*) as total_days,
MAX(consecutive_days) as max_consecutive,
(SELECT check_in_date FROM user_check_in
WHERE user_id = ? ORDER BY check_in_date DESC LIMIT 1) as last_date
FROM user_check_in WHERE user_id = ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$userId, $userId]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}






