当前位置:首页 > PHP

php实现签到

2026-02-14 17:53:26PHP

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>

安全考虑

添加防刷机制和安全验证:

php实现签到

// 验证用户登录状态
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签到功能实现方案,包括数据库设计、签到逻辑、连续签到统计、奖励系统和前端展示。实际应用中可根据需求进行调整和扩展。

标签: php
分享给朋友:

相关文章

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT AU…

php实现静态

php实现静态

静态化实现方法 PHP实现静态化主要通过生成HTML文件或缓存机制来减少服务器动态解析的开销。以下是几种常见方法: 生成静态HTML文件 通过file_put_contents()将动态内容保存为H…

php实现一个

php实现一个

PHP 实现一个简单的计算器 创建一个基本的计算器,支持加、减、乘、除运算。以下是一个完整的实现代码示例: <?php $result = ""; if ($_SERVER["REQUEST_…

php实现推送消息推送消息

php实现推送消息推送消息

PHP 实现消息推送的方法 使用 WebSocket 实现实时推送 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时消息推送。 安装 Ratchet 库(WebSo…

php实现伪静态

php实现伪静态

PHP 实现伪静态的方法 伪静态(URL Rewrite)是一种将动态URL转换为看似静态URL的技术,提升SEO友好性和用户体验。以下是几种常见的实现方式: 使用 Apache 的 mod_rew…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…