当前位置:首页 > 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)
);

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

// 检查是否已签到
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方式处理签到请求:

$('#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防护和频率限制:

php实现按钮签到功能实现

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.js 是一个渐进式 JavaScript 框架,广泛用于构建用户界面。以下是 Vue 功能的常见实现方法。 数据绑定 Vue 的核心功能之一是数据绑定,通过 v-mod…

css 制作按钮

css 制作按钮

基础按钮样式 使用CSS创建一个基础按钮需要定义padding、background-color、border和border-radius等属性。以下是一个简单示例: .button { pad…

vue实现按钮

vue实现按钮

Vue 实现按钮的方法 在 Vue 中实现按钮可以通过多种方式,包括使用原生 HTML 按钮、Vue 组件封装或结合 UI 框架(如 Element UI、Vuetify 等)。以下是几种常见的实现方…

vue实现单选按钮

vue实现单选按钮

实现单选按钮的基本方法 在Vue中实现单选按钮通常使用v-model指令绑定数据,结合input元素的type="radio"属性。以下是一个基础示例: <template> <…

vue功能实现难点

vue功能实现难点

Vue 功能实现的常见难点 响应式系统深度监听 Vue 的响应式系统基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3),但对嵌套对象或数组的深层属性变化需要额外…

vue实现app功能

vue实现app功能

Vue 实现 App 功能的常见方法 使用 Capacitor 或 Cordova 进行混合开发 Vue 结合 Capacitor 或 Cordova 可以将 Web 应用打包成原生 App。Capa…