当前位置:首页 > PHP

php签到功能实现

2026-04-03 02:37:05PHP

PHP 签到功能实现

数据库设计

创建一个名为sign_in的表,用于存储用户签到记录:

php签到功能实现

CREATE TABLE `sign_in` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `sign_date` date NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_date` (`user_id`,`sign_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

签到功能实现

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

// 获取用户ID(假设已登录)
$user_id = $_SESSION['user_id'];

// 检查今日是否已签到
$stmt = $db->prepare("SELECT COUNT(*) FROM sign_in WHERE user_id = ? AND sign_date = CURDATE()");
$stmt->execute([$user_id]);
$hasSigned = $stmt->fetchColumn();

if ($hasSigned) {
    echo "今日已签到";
} else {
    // 执行签到
    $stmt = $db->prepare("INSERT INTO sign_in (user_id, sign_date) VALUES (?, CURDATE())");
    $stmt->execute([$user_id]);
    echo "签到成功";
}
?>

连续签到功能

// 检查连续签到天数
$stmt = $db->prepare("
    SELECT COUNT(*) as consecutive_days 
    FROM (
        SELECT DISTINCT sign_date 
        FROM sign_in 
        WHERE user_id = ? 
        ORDER BY sign_date DESC
    ) dates
    WHERE DATEDIFF(CURDATE(), sign_date) = (
        SELECT COUNT(*) - 1 
        FROM (
            SELECT DISTINCT sign_date 
            FROM sign_in 
            WHERE user_id = ? 
            ORDER BY sign_date DESC
        ) t
        WHERE DATEDIFF(CURDATE(), sign_date) <= (SELECT COUNT(*) - 1 FROM (
            SELECT DISTINCT sign_date 
            FROM sign_in 
            WHERE user_id = ? 
            ORDER BY sign_date DESC
        ) t2)
    )
");
$stmt->execute([$user_id, $user_id, $user_id]);
$consecutiveDays = $stmt->fetchColumn();
echo "已连续签到: ".$consecutiveDays."天";

签到奖励系统

// 根据连续签到天数给予奖励
if ($consecutiveDays >= 7) {
    // 每周奖励
    $reward = 100;
} elseif ($consecutiveDays >= 30) {
    // 每月奖励
    $reward = 500;
} else {
    // 每日基础奖励
    $reward = 10;
}

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

签到日历展示

// 获取当月签到记录
$stmt = $db->prepare("
    SELECT DAY(sign_date) as day 
    FROM sign_in 
    WHERE user_id = ? 
    AND MONTH(sign_date) = MONTH(CURDATE()) 
    AND YEAR(sign_date) = YEAR(CURDATE())
");
$stmt->execute([$user_id]);
$signedDays = $stmt->fetchAll(PDO::FETCH_COLUMN);

// 生成日历
$daysInMonth = date('t');
$firstDay = date('w', strtotime(date('Y-m-01')));

echo "<table><tr>";
for ($i = 0; $i < $firstDay; $i++) {
    echo "<td></td>";
}

for ($day = 1; $day <= $daysInMonth; $day++) {
    if (($day + $firstDay - 1) % 7 == 0) {
        echo "</tr><tr>";
    }
    $class = in_array($day, $signedDays) ? 'signed' : '';
    echo "<td class='$class'>$day</td>";
}
echo "</tr></table>";

样式示例

.signed {
    background-color: #4CAF50;
    color: white;
    border-radius: 50%;
}
table {
    border-collapse: collapse;
}
td {
    width: 30px;
    height: 30px;
    text-align: center;
    border: 1px solid #ddd;
}

以上代码实现了一个完整的PHP签到系统,包含基础签到、连续签到计算、奖励系统和日历展示功能。根据实际需求可以进一步扩展和完善。

标签: 功能php
分享给朋友:

相关文章

vue实现后台功能

vue实现后台功能

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

vue 实现筛选功能

vue 实现筛选功能

实现筛选功能的基本思路 在Vue中实现筛选功能通常涉及以下几个核心步骤:数据绑定、筛选逻辑处理、结果展示。以下是具体实现方法。 数据准备与绑定 准备一个包含所有数据的数组,并使用v-model或v-…

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart/…

php实现的分页

php实现的分页

PHP 实现分页的方法 基本分页逻辑 分页的核心在于计算总页数、当前页码以及数据偏移量。假设每页显示 10 条数据: $current_page = isset($_GET['page']) ? (…

php实现的进度条

php实现的进度条

PHP 实现的进度条方法 在 PHP 中实现进度条通常可以通过命令行脚本(CLI)或 Web 页面两种方式完成。以下是几种常见的实现方法: 命令行进度条 使用 PHP CLI 实现进度条,可以通过不…

vue实现论坛功能

vue实现论坛功能

实现论坛功能的核心模块 论坛功能通常包含用户发帖、回帖、分类浏览、搜索等核心模块。Vue.js 作为前端框架,需配合后端 API 实现数据交互。 基础项目结构搭建 使用 Vue CLI 或 Vite…