当前位置:首页 > PHP

php签到功能实现

2026-02-13 19:03:56PHP

PHP签到功能实现

数据库设计

创建一张用户签到表,包含以下字段:

php签到功能实现

  • id:自增主键
  • user_id:用户ID
  • sign_date:签到日期
  • continuous_days:连续签到天数
  • created_at:创建时间
CREATE TABLE `user_sign` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `sign_date` date NOT NULL,
  `continuous_days` int(11) NOT NULL DEFAULT 1,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_date` (`user_id`,`sign_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

签到逻辑实现

检查用户是否已签到,未签到则插入记录并更新连续签到天数

php签到功能实现

function signIn($userId) {
    $today = date('Y-m-d');
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

    // 检查今日是否已签到
    $stmt = $pdo->prepare("SELECT id FROM user_sign WHERE user_id = ? AND sign_date = ?");
    $stmt->execute([$userId, $today]);
    if ($stmt->fetch()) {
        return ['status' => 0, 'msg' => '今日已签到'];
    }

    // 获取昨日签到记录
    $yesterday = date('Y-m-d', strtotime('-1 day'));
    $stmt = $pdo->prepare("SELECT continuous_days FROM user_sign WHERE user_id = ? AND sign_date = ?");
    $stmt->execute([$userId, $yesterday]);
    $continuousDays = $stmt->fetch() ? $stmt->fetch()['continuous_days'] + 1 : 1;

    // 插入今日签到记录
    $stmt = $pdo->prepare("INSERT INTO user_sign (user_id, sign_date, continuous_days) VALUES (?, ?, ?)");
    $stmt->execute([$userId, $today, $continuousDays]);

    return ['status' => 1, 'msg' => '签到成功', 'continuous_days' => $continuousDays];
}

签到统计功能

获取用户本月签到情况和连续签到天数

function getSignInfo($userId) {
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $currentMonth = date('Y-m');

    // 获取本月签到日期
    $stmt = $pdo->prepare("SELECT sign_date FROM user_sign WHERE user_id = ? AND sign_date LIKE ?");
    $stmt->execute([$userId, "$currentMonth%"]);
    $signDates = $stmt->fetchAll(PDO::FETCH_COLUMN);

    // 获取最近连续签到天数
    $stmt = $pdo->prepare("SELECT continuous_days FROM user_sign WHERE user_id = ? ORDER BY sign_date DESC LIMIT 1");
    $stmt->execute([$userId]);
    $continuousDays = $stmt->fetch() ? $stmt->fetch()['continuous_days'] : 0;

    return [
        'sign_dates' => $signDates,
        'continuous_days' => $continuousDays,
        'current_month' => $currentMonth
    ];
}

前端展示示例

简单的HTML页面展示签到按钮和签到日历

<div class="sign-container">
    <button id="signBtn" onclick="doSign()">立即签到</button>
    <div id="signCalendar"></div>
</div>

<script>
function doSign() {
    fetch('/sign.php?action=sign')
        .then(response => response.json())
        .then(data => {
            if(data.status) {
                alert('签到成功!连续签到' + data.continuous_days + '天');
                location.reload();
            } else {
                alert(data.msg);
            }
        });
}
</script>

注意事项

  • 数据库连接需要根据实际环境配置
  • 建议添加事务处理保证数据一致性
  • 重要操作建议记录日志
  • 高并发场景需要考虑锁机制
  • 签到奖励逻辑可根据业务需求扩展

标签: 功能php
分享给朋友:

相关文章

vue实现考试多选功能

vue实现考试多选功能

Vue实现考试多选功能 数据绑定与选项渲染 使用v-model绑定用户选择的答案数组,结合v-for循环渲染选项列表。示例代码: <template> <div>…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="uploa…

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/t…

vue实现按钮实现点击功能

vue实现按钮实现点击功能

实现按钮点击功能 在Vue中实现按钮点击功能可以通过v-on指令或@缩写来绑定事件。以下是几种常见的实现方式: 使用v-on指令 通过v-on:click绑定点击事件,触发定义在methods中的…

php实现分类

php实现分类

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