当前位置:首页 > PHP

php签到功能实现

2026-04-03 02:37:05PHP

php签到功能实现

php签到功能实现

PHP 签到功能实现

数据库设计

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

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中实现账号注册功能通常需要结合前端表单和后端API交互。以下是一个完整的实现方案: 创建注册表单组件 新建一个Register.vue组件,包含基本的注册表单字段: &l…

vue实现名字查找功能

vue实现名字查找功能

实现名字查找功能 在Vue中实现名字查找功能,可以通过多种方式完成。以下是几种常见的实现方法: 使用v-model和computed属性 创建一个输入框,使用v-model绑定输入的值,通过comp…

php实现搜索

php实现搜索

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

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php 无限分类的实现

php 无限分类的实现

无限分类的实现方法 无限分类通常用于构建树形结构数据,如商品分类、多级菜单等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 邻接列表是最简单的实现方式,通过在每个节点中存…

php实现https

php实现https

PHP 实现 HTTPS 请求 在 PHP 中实现 HTTPS 请求,可以通过多种方式完成,包括使用内置函数、cURL 扩展或第三方库。以下是几种常见的方法: 使用 file_get_content…