当前位置:首页 > PHP

php 签到功能实现

2026-03-13 10:39:43PHP

PHP 签到功能实现

数据库设计

创建一个用户签到表,包含用户ID、签到日期和连续签到天数等字段:

CREATE TABLE user_checkin (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    checkin_date DATE NOT NULL,
    consecutive_days INT DEFAULT 1,
    UNIQUE KEY (user_id, checkin_date)
);

基础签到逻辑

检查用户是否已签到,未签到则插入记录:

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

    // 检查今日是否已签到
    $stmt = $pdo->prepare("SELECT 1 FROM user_checkin WHERE user_id = ? AND checkin_date = ?");
    $stmt->execute([$userId, $today]);

    if ($stmt->fetch()) {
        return ['status' => 'error', 'message' => '今日已签到'];
    }

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

    $consecutiveDays = $lastRecord ? $lastRecord['consecutive_days'] + 1 : 1;

    // 插入签到记录
    $stmt = $pdo->prepare("INSERT INTO user_checkin (user_id, checkin_date, consecutive_days) VALUES (?, ?, ?)");
    $stmt->execute([$userId, $today, $consecutiveDays]);

    return ['status' => 'success', 'consecutive_days' => $consecutiveDays];
}

连续签到奖励

根据连续签到天数给予不同奖励:

function getReward($consecutiveDays) {
    $rewards = [
        3 => ['points' => 10, 'name' => '三日礼包'],
        7 => ['points' => 30, 'name' => '七日礼包'],
        30 => ['points' => 100, 'name' => '月礼包']
    ];

    return $rewards[$consecutiveDays] ?? ['points' => 1, 'name' => '每日签到'];
}

签到统计功能

获取用户本月签到情况:

function getMonthlyCheckins($userId) {
    $firstDay = date('Y-m-01');
    $lastDay = date('Y-m-t');

    $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
    $stmt = $pdo->prepare("SELECT checkin_date FROM user_checkin 
                          WHERE user_id = ? AND checkin_date BETWEEN ? AND ?");
    $stmt->execute([$userId, $firstDay, $lastDay]);

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

前端调用示例

通过AJAX调用签到接口:

php 签到功能实现

$('#checkin-btn').click(function() {
    $.post('/api/checkin.php', {user_id: 123}, function(response) {
        if (response.status === 'success') {
            alert(`签到成功!连续签到${response.consecutive_days}天`);
        } else {
            alert(response.message);
        }
    });
});

安全注意事项

  1. 用户ID应从会话中获取,避免前端传递可伪造的ID
  2. 对数据库操作使用预处理语句防止SQL注入
  3. 重要操作应记录日志
  4. 考虑添加每日签到次数限制

性能优化建议

  1. 为user_id和checkin_date字段添加复合索引
  2. 对高频访问的签到数据可考虑缓存
  3. 批量查询时使用WHERE IN替代多次单条查询

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

相关文章

php实现文件下载

php实现文件下载

PHP 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个流行的前端框架,用于构建用户界面和单页应用。以下是 Vue 功能实现的关键方法和技术。 数据绑定与响应式 Vue 的核心特性是数据绑定和响应式系统。通过 d…

php实现递归

php实现递归

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

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移除…

php实现

php实现

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

php实现聊天

php实现聊天

实现 PHP 聊天功能的方法 使用 WebSocket 和 PHP 实现实时聊天 WebSocket 是一种全双工通信协议,适合实现实时聊天功能。PHP 可以通过 Ratchet 库实现 WebSo…