当前位置:首页 > PHP

php 实现 签到功能实现

2026-02-15 03:10:14PHP

数据库设计

创建一张签到记录表,包含用户ID、签到日期和连续签到天数等字段。表结构如下:

CREATE TABLE `sign_records` (
  `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,
  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');

    try {
        $pdo->beginTransaction();

        // 检查是否已签到
        $stmt = $pdo->prepare("SELECT 1 FROM sign_records WHERE user_id = ? AND sign_date = ?");
        $stmt->execute([$userId, $today]);
        if ($stmt->fetch()) {
            throw new Exception('今日已签到');
        }

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

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

        $pdo->commit();
        return ['success' => true, 'continuous_days' => $continuousDays];
    } catch (Exception $e) {
        $pdo->rollBack();
        return ['success' => false, 'message' => $e->getMessage()];
    }
}

签到奖励处理

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

php 实现 签到功能实现

function giveSignReward($userId, $continuousDays) {
    $rewards = [
        3 => ['points' => 10],
        7 => ['points' => 30, 'vip_days' => 1],
        30 => ['points' => 100, 'vip_days' => 7]
    ];

    if (isset($rewards[$continuousDays])) {
        // 实现奖励发放逻辑
        // 如更新用户积分、VIP有效期等
        return $rewards[$continuousDays];
    }
    return null;
}

前端接口设计

提供签到状态查询和签到操作两个接口:

// 获取签到状态
$app->get('/sign/status/{user_id}', function ($request, $response, $args) {
    $userId = $args['user_id'];
    $today = date('Y-m-d');

    $stmt = $pdo->prepare("SELECT 1 FROM sign_records WHERE user_id = ? AND sign_date = ?");
    $stmt->execute([$userId, $today]);
    $signed = (bool)$stmt->fetch();

    return $response->withJson(['signed' => $signed]);
});

// 执行签到
$app->post('/sign/{user_id}', function ($request, $response, $args) {
    $result = signIn($args['user_id']);
    if ($result['success']) {
        $reward = giveSignReward($args['user_id'], $result['continuous_days']);
        $result['reward'] = $reward;
    }
    return $response->withJson($result);
});

数据统计功能

添加按月统计签到次数的功能,便于后台管理:

function getMonthlySignData($userId, $yearMonth) {
    $startDate = "$yearMonth-01";
    $endDate = date('Y-m-t', strtotime($startDate));

    $stmt = $pdo->prepare("
        SELECT sign_date, continuous_days 
        FROM sign_records 
        WHERE user_id = ? AND sign_date BETWEEN ? AND ?
        ORDER BY sign_date
    ");
    $stmt->execute([$userId, $startDate, $endDate]);

    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

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

相关文章

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

vue实现拨号功能

vue实现拨号功能

Vue 实现拨号功能 使用 tel: 协议实现基础拨号 在 Vue 中可以通过 HTML 的 <a> 标签结合 tel: 协议实现拨号功能。这种方式适用于移动端浏览器,点击后会直接调用系统…

vue 实现筛选功能

vue 实现筛选功能

实现筛选功能的基本思路 在Vue中实现筛选功能通常涉及以下几个核心步骤:数据绑定、筛选逻辑处理、结果展示。以下是具体实现方法。 数据准备与绑定 准备一个包含所有数据的数组,并使用v-model或v-…

php实现一个

php实现一个

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

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…

php 路由实现的

php 路由实现的

PHP 路由实现方法 基于原生 PHP 实现路由 创建一个简单的路由解析器,通过解析 URL 路径来调用对应的控制器或函数。 // 定义路由表 $routes = [ '/' => '…