当前位置:首页 > 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中编写签到处理逻辑,检查用户是否已签到:

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']."天";

签到奖励系统

实现基于连续签到的奖励机制:

php实现签到

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

标签: php
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP实现打印功能的方法 在PHP中实现打印功能可以通过多种方式完成,包括直接输出到浏览器、生成PDF文件、调用打印机接口等。以下是几种常见的方法: 直接输出HTML内容 PHP可以通过echo或p…

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (in…

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session是…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE o…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…