当前位置:首页 > PHP

php 实现签到

2026-01-29 17:41:13PHP

PHP 实现签到功能

数据库设计

创建一个用户签到表,包含用户ID、签到日期等字段。示例SQL:

CREATE TABLE user_check_in (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    check_in_date DATE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY (user_id, check_in_date)
);

签到逻辑实现

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

<?php
// 连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

$userId = 1; // 当前用户ID
$today = date('Y-m-d');

// 检查是否已签到
$stmt = $pdo->prepare("SELECT id FROM user_check_in WHERE user_id = ? AND check_in_date = ?");
$stmt->execute([$userId, $today]);

if ($stmt->fetch()) {
    echo "今日已签到";
} else {
    // 执行签到
    $insert = $pdo->prepare("INSERT INTO user_check_in (user_id, check_in_date) VALUES (?, ?)");
    if ($insert->execute([$userId, $today])) {
        echo "签到成功";
    } else {
        echo "签到失败";
    }
}
?>

连续签到统计

查询用户最近连续签到天数:

// 查询连续签到天数
$stmt = $pdo->prepare("
    SELECT COUNT(*) as consecutive_days 
    FROM (
        SELECT check_in_date 
        FROM user_check_in 
        WHERE user_id = ? 
        ORDER BY check_in_date DESC
    ) t 
    WHERE check_in_date = DATE_SUB(CURDATE(), INTERVAL (SELECT COUNT(*) - 1) DAY)
");
$stmt->execute([$userId]);
$result = $stmt->fetch();
echo "连续签到: " . $result['consecutive_days'] . "天";

签到奖励系统

根据签到情况给予奖励:

// 根据连续签到天数发放奖励
$consecutiveDays = $result['consecutive_days'];
$reward = 0;

if ($consecutiveDays >= 7) {
    $reward = 50;
} elseif ($consecutiveDays >= 3) {
    $reward = 20;
} else {
    $reward = 10;
}

// 更新用户积分
$update = $pdo->prepare("UPDATE users SET points = points + ? WHERE id = ?");
$update->execute([$reward, $userId]);
echo "获得奖励积分: " . $reward;

防止重复签到

在数据库层面设置唯一索引,确保用户每天只能签到一次:

ALTER TABLE user_check_in ADD UNIQUE INDEX idx_user_date (user_id, check_in_date);

签到日历展示

显示用户当月签到情况:

php 实现签到

// 获取当月所有签到日期
$month = date('Y-m');
$stmt = $pdo->prepare("
    SELECT check_in_date 
    FROM user_check_in 
    WHERE user_id = ? 
    AND check_in_date LIKE '$month%'
");
$stmt->execute([$userId]);
$signedDates = $stmt->fetchAll(PDO::FETCH_COLUMN);

// 生成日历HTML
echo "<div class='calendar'>";
for ($day = 1; $day <= date('t'); $day++) {
    $date = $month . '-' . str_pad($day, 2, '0', STR_PAD_LEFT);
    $signed = in_array($date, $signedDates) ? 'signed' : '';
    echo "<span class='day $signed'>$day</span>";
}
echo "</div>";

标签: php
分享给朋友:

相关文章

php实现栈

php实现栈

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

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php实现注册登录

php实现注册登录

PHP 注册功能实现 创建数据库表(以 MySQL 为例) CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…