当前位置:首页 > 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实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Sessi…

php 实现跳转

php 实现跳转

PHP 实现页面跳转的方法 在PHP中,实现页面跳转可以通过多种方式完成,以下是几种常用的方法: 使用header函数 header函数是PHP中最常用的跳转方法,通过发送HTTP头部信息实现跳转。…

php session 实现购物车

php session 实现购物车

PHP Session 实现购物车的方法 初始化 Session 在 PHP 脚本的最开始调用 session_start() 函数,确保会话已启用。这通常在页面的顶部完成。 session_sta…

php无法实现

php无法实现

PHP 是一种功能强大的服务器端脚本语言,能够实现多种功能,包括动态网页开发、数据库交互、文件操作等。如果遇到“无法实现”的问题,通常是由于以下原因之一: 环境配置问题 确保 PHP 环境正确安装和…