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,
UNIQUE KEY (user_id, check_in_date)
);
签到逻辑处理
检查用户今日是否已签到,未签到则更新数据。示例代码:
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 '今日已签到';
}
// 获取昨日签到记录
$yesterday = date('Y-m-d', strtotime('-1 day'));
$stmt = $pdo->prepare("SELECT consecutive_days FROM user_check_in WHERE user_id = ? AND check_in_date = ?");
$stmt->execute([$userId, $yesterday]);
$consecutiveDays = $stmt->fetch() ? $stmt->fetch()['consecutive_days'] + 1 : 1;
// 插入签到记录
$stmt = $pdo->prepare("INSERT INTO user_check_in (user_id, check_in_date, consecutive_days) VALUES (?, ?, ?)");
$stmt->execute([$userId, $today, $consecutiveDays]);
return '签到成功,连续签到' . $consecutiveDays . '天';
}
签到奖励机制
根据连续签到天数给予不同奖励。可在签到函数中添加:
function getReward($consecutiveDays) {
if ($consecutiveDays % 7 == 0) {
return '获得周奖励';
} elseif ($consecutiveDays % 30 == 0) {
return '获得月奖励';
}
return '获得每日奖励';
}
签到数据展示
查询用户签到历史和连续天数:
function getCheckInHistory($userId) {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare("SELECT check_in_date, consecutive_days FROM user_check_in WHERE user_id = ? ORDER BY check_in_date DESC");
$stmt->execute([$userId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
防止作弊
在服务器端验证签到时间,避免客户端修改时间:
$serverTime = time();
$clientTime = $_POST['timestamp']; // 来自客户端的时间
if (abs($serverTime - $clientTime) > 300) { // 允许5分钟误差
die('时间校验失败');
}
补签功能
允许用户使用积分补签:
function makeUpCheckIn($userId, $date) {
// 检查是否已签到
// 检查用户是否有足够积分
// 扣除积分并插入补签记录
// 更新连续签到天数
}






