当前位置:首页 > PHP

php实现按钮签到功能实现

2026-02-15 03:34:21PHP

PHP实现按钮签到功能

数据库准备 创建签到表sign_in,包含字段:id(主键)、user_id(用户ID)、sign_date(签到日期)、points(获得积分)。示例SQL:

CREATE TABLE sign_in (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    sign_date DATE NOT NULL,
    points INT DEFAULT 10,
    UNIQUE KEY (user_id, sign_date)
);

签到逻辑实现 通过判断当天是否已签到防止重复操作:

php实现按钮签到功能实现

// 检查是否已签到
function hasSignedToday($userId) {
    $today = date('Y-m-d');
    $query = "SELECT COUNT(*) FROM sign_in WHERE user_id = ? AND sign_date = ?";
    $stmt = $pdo->prepare($query);
    $stmt->execute([$userId, $today]);
    return $stmt->fetchColumn() > 0;
}

// 执行签到
function doSignIn($userId) {
    if (hasSignedToday($userId)) {
        return ['status' => 'error', 'message' => '今日已签到'];
    }

    $today = date('Y-m-d');
    $points = 10; // 默认积分

    $query = "INSERT INTO sign_in (user_id, sign_date, points) VALUES (?, ?, ?)";
    $stmt = $pdo->prepare($query);
    $stmt->execute([$userId, $today, $points]);

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

前端交互 AJAX方式处理签到请求:

php实现按钮签到功能实现

$('#signBtn').click(function() {
    $.post('sign_in.php', {action: 'sign'}, function(response) {
        if (response.status === 'success') {
            alert('签到成功,获得' + response.points + '积分');
            $('#signBtn').prop('disabled', true);
        } else {
            alert(response.message);
        }
    }, 'json');
});

连续签到奖励 扩展签到表增加continuous_days字段,更新签到逻辑:

function checkContinuousSign($userId) {
    $yesterday = date('Y-m-d', strtotime('-1 day'));
    $query = "SELECT continuous_days FROM sign_in WHERE user_id = ? AND sign_date = ?";
    $stmt = $pdo->prepare($query);
    $stmt->execute([$userId, $yesterday]);
    return $stmt->fetchColumn() ?: 0;
}

function doSignInWithContinuous($userId) {
    $continuousDays = checkContinuousSign($userId) + 1;
    $points = 10 + floor($continuousDays/7) * 5; // 每周额外奖励

    $query = "INSERT INTO sign_in (...) VALUES (..., ?)";
    $stmt->execute([..., $continuousDays]);
}

安全防护 添加CSRF防护和频率限制:

session_start();
if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) {
    die('非法请求');
}

// 频率限制
$ip = $_SERVER['REMOTE_ADDR'];
$key = 'sign_limit_' . $ip;
if ($cache->get($key)) {
    die('操作过于频繁');
}
$cache->set($key, 1, 60); // 60秒内限制1次

标签: 按钮功能
分享给朋友:

相关文章

vue实现按钮刷新

vue实现按钮刷新

Vue 实现按钮刷新功能 在 Vue 中实现按钮刷新功能可以通过多种方式实现,具体取决于刷新需求是局部刷新还是全局刷新。以下是几种常见的方法: 使用 window.location.reload(…

vue实现功能插件

vue实现功能插件

Vue 插件实现方法 Vue 插件通常用于封装全局功能(如指令、过滤器、混入等),以下是实现 Vue 插件的典型方式: 插件基本结构 const MyPlugin = { instal…

vue实现单选按钮

vue实现单选按钮

使用 v-model 绑定单选按钮 在 Vue 中,可以通过 v-model 实现单选按钮的数据绑定。单选按钮组需要共享同一个 v-model 绑定的变量,并通过 value 属性区分选项。 &l…

vue实现按钮组轮换

vue实现按钮组轮换

Vue 实现按钮组轮换的方法 在 Vue 中实现按钮组轮换功能,可以通过动态绑定数据和事件处理来实现。以下是几种常见的方法: 使用 v-for 动态渲染按钮组 通过 v-for 指令动态渲染按钮组,…

php实现分页功能

php实现分页功能

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

uniapp实现支付功能

uniapp实现支付功能

支付功能实现概述 在UniApp中实现支付功能通常需要对接第三方支付平台(如微信支付、支付宝支付等)。以下是基于微信支付和支付宝支付的通用实现流程。 微信支付实现步骤 1. 配置支付权限 在微信开…