php实现签到
PHP实现签到功能
数据库设计
创建一个用于存储签到记录的数据表,包含用户ID、签到日期等字段:
CREATE TABLE `sign_records` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`sign_date` date NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `user_date` (`user_id`,`sign_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
签到逻辑实现
在PHP中编写签到处理逻辑,检查用户是否已签到:

// 获取当前用户ID和日期
$user_id = $_SESSION['user_id'];
$today = date('Y-m-d');
// 检查是否已签到
$check_sql = "SELECT id FROM sign_records WHERE user_id = ? AND sign_date = ?";
$stmt = $pdo->prepare($check_sql);
$stmt->execute([$user_id, $today]);
if ($stmt->rowCount() > 0) {
echo "今日已签到";
} else {
// 执行签到操作
$insert_sql = "INSERT INTO sign_records (user_id, sign_date) VALUES (?, ?)";
$stmt = $pdo->prepare($insert_sql);
$stmt->execute([$user_id, $today]);
echo "签到成功";
}
连续签到统计
添加连续签到天数的统计功能:
// 获取最近连续签到天数
$continuous_sql = "SELECT COUNT(*) as days FROM (
SELECT sign_date FROM sign_records
WHERE user_id = ?
ORDER BY sign_date DESC
) t WHERE sign_date >= DATE_SUB(CURDATE(), INTERVAL (SELECT COUNT(*) FROM (
SELECT sign_date FROM sign_records
WHERE user_id = ?
ORDER BY sign_date DESC
) t2 WHERE sign_date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH))) DAY)";
$stmt = $pdo->prepare($continuous_sql);
$stmt->execute([$user_id, $user_id]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
echo "您已连续签到".$result['days']."天";
签到奖励系统
实现基于连续签到的奖励机制:

// 根据连续签到天数发放奖励
if ($result['days'] >= 7) {
// 发放周奖励
$reward_sql = "UPDATE users SET points = points + 100 WHERE id = ?";
$stmt = $pdo->prepare($reward_sql);
$stmt->execute([$user_id]);
echo "获得连续7天签到奖励:100积分";
} elseif ($result['days'] >= 30) {
// 发放月奖励
$reward_sql = "UPDATE users SET points = points + 500 WHERE id = ?";
$stmt = $pdo->prepare($reward_sql);
$stmt->execute([$user_id]);
echo "获得连续30天签到奖励:500积分";
}
前端展示
创建简单的HTML界面展示签到状态:
<div class="sign-container">
<h3>每日签到</h3>
<p id="sign-status"><?php echo $sign_status; ?></p>
<button id="sign-btn" <?php echo $is_signed ? 'disabled' : ''; ?>>签到</button>
<p>连续签到天数:<?php echo $continuous_days; ?></p>
</div>
<script>
document.getElementById('sign-btn').addEventListener('click', function() {
fetch('/api/sign.php', {
method: 'POST'
}).then(response => response.json())
.then(data => {
if(data.success) {
document.getElementById('sign-status').innerText = "签到成功";
this.disabled = true;
}
});
});
</script>
安全考虑
添加防刷机制和安全验证:
// 验证用户登录状态
if (!isset($_SESSION['user_id'])) {
http_response_code(401);
die("请先登录");
}
// 限制每日签到次数
$ip = $_SERVER['REMOTE_ADDR'];
$ip_check_sql = "SELECT COUNT(*) FROM sign_records WHERE ip = ? AND DATE(created_at) = CURDATE()";
$stmt = $pdo->prepare($ip_check_sql);
$stmt->execute([$ip]);
if ($stmt->fetchColumn() > 3) {
http_response_code(429);
die("签到次数过多");
}
以上代码提供了完整的PHP签到功能实现方案,包括数据库设计、签到逻辑、连续签到统计、奖励系统和前端展示。实际应用中可根据需求进行调整和扩展。






