当前位置:首页 > 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 中实现截屏功能可以通过多种方式完成,以下是几种常见的方法: 使用 html2canvas 库 安装 html2canvas 库: npm install…

uniapp实现支付功能

uniapp实现支付功能

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

vue实现后台功能

vue实现后台功能

Vue 实现后台功能的方法 Vue.js 是一个流行的前端框架,适合构建后台管理系统。以下是实现后台功能的常见方法和步骤。 项目初始化 使用 Vue CLI 或 Vite 初始化项目: # Vue…

vue实现拨号功能

vue实现拨号功能

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

css按钮制作

css按钮制作

CSS按钮制作方法 基础按钮样式 创建一个简单的CSS按钮需要定义基本属性,如背景色、边框、内边距和文字样式。示例代码: .btn { background-color: #4CAF50;…

h5能实现抽题功能吗

h5能实现抽题功能吗

H5实现抽题功能的技术方案 H5完全能够实现抽题功能,主要通过前端技术结合后端数据交互完成。以下是具体实现方式: 前端技术实现 HTML5结合JavaScript可以动态生成和展示题目,利用DOM操…