当前位置:首页 > 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 实现签到

<?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'] . "天";

签到奖励系统

根据签到情况给予奖励:

php 实现签到

// 根据连续签到天数发放奖励
$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);

签到日历展示

显示用户当月签到情况:

// 获取当月所有签到日期
$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实现分页的基本方法 使用原生PHP实现分页功能需要结合数据库查询和HTML展示。以下是核心实现步骤: 数据库查询与分页逻辑 // 连接数据库 $conn = new mysqli('loca…

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session…

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTM…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php 实现接口

php 实现接口

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

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…