当前位置:首页 > PHP

php 实现 签到功能实现

2026-03-13 02:01:05PHP

数据库设计

创建一个签到表用于存储用户的签到记录,字段包括用户ID、签到日期、连续签到天数等。示例SQL如下:

CREATE TABLE `user_check_in` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `check_in_date` date NOT NULL,
  `continuous_days` int(11) DEFAULT 1,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_date` (`user_id`,`check_in_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

签到逻辑实现

通过PHP判断用户当日是否已签到,未签到则插入记录并更新连续签到天数。示例代码:

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 ['status' => 'error', 'message' => '今日已签到'];
    }

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

    // 计算连续签到天数
    $continuousDays = $lastRecord ? $lastRecord['continuous_days'] + 1 : 1;

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

    return ['status' => 'success', 'continuous_days' => $continuousDays];
}

奖励机制

根据连续签到天数发放不同奖励,可在签到成功后调用奖励函数:

function giveReward($userId, $continuousDays) {
    $rewards = [
        3 => ['type' => 'points', 'amount' => 10],
        7 => ['type' => 'points', 'amount' => 30],
        30 => ['type' => 'vip', 'days' => 1]
    ];

    if (isset($rewards[$continuousDays])) {
        $reward = $rewards[$continuousDays];
        // 实现发放奖励逻辑
        return $reward;
    }
    return null;
}

签到统计

提供查询用户签到情况的接口:

php 实现 签到功能实现

function getCheckInStats($userId) {
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

    // 当月签到记录
    $stmt = $pdo->prepare("SELECT check_in_date FROM user_check_in 
                          WHERE user_id = ? AND MONTH(check_in_date) = MONTH(CURRENT_DATE())");
    $stmt->execute([$userId]);
    $dates = $stmt->fetchAll(PDO::FETCH_COLUMN);

    // 连续签到天数
    $stmt = $pdo->prepare("SELECT continuous_days FROM user_check_in 
                          WHERE user_id = ? ORDER BY check_in_date DESC LIMIT 1");
    $stmt->execute([$userId]);
    $continuousDays = $stmt->fetchColumn();

    return [
        'checked_dates' => $dates,
        'continuous_days' => $continuousDays ?: 0
    ];
}

安全考虑

  1. 对用户输入进行验证和过滤
  2. 使用预处理语句防止SQL注入
  3. 重要操作记录日志
  4. 考虑添加每日签到限制

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

相关文章

php实现分页功能

php实现分页功能

PHP实现分页功能的方法 数据库查询与分页逻辑 使用SQL的LIMIT和OFFSET实现分页。假设每页显示10条数据,当前页码为$page: $perPage = 10; $page = isset…

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…

vue实现功能插件

vue实现功能插件

Vue 功能插件实现方法 插件基本结构 Vue 插件通常需要暴露一个 install 方法,该方法接收 Vue 构造函数作为参数。基本结构如下: const MyPlugin = { insta…

php实现静态

php实现静态

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

php实现推送消息推送消息

php实现推送消息推送消息

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

php实现域名

php实现域名

PHP实现域名操作的方法 获取当前域名 使用$_SERVER['HTTP_HOST']可以获取当前访问的域名: $currentDomain = $_SERVER['HTTP_HOST']; ech…