PHP签到实现
PHP签到功能实现
PHP实现签到功能需要结合数据库存储用户签到记录,并提供前端交互界面。以下是一个完整的实现方案:
数据库设计
创建用户表users和签到记录表sign_records:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL
);
CREATE TABLE sign_records (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
sign_date DATE NOT NULL,
sign_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
签到逻辑实现
创建签到处理脚本sign.php:
<?php
session_start();
require 'db_connect.php'; // 数据库连接文件
if (!isset($_SESSION['user_id'])) {
die("请先登录");
}
$userId = $_SESSION['user_id'];
$today = date('Y-m-d');
// 检查今天是否已签到
$checkSql = "SELECT id FROM sign_records WHERE user_id = ? AND sign_date = ?";
$stmt = $pdo->prepare($checkSql);
$stmt->execute([$userId, $today]);
if ($stmt->rowCount() > 0) {
echo "今日已签到";
exit;
}
// 执行签到
$insertSql = "INSERT INTO sign_records (user_id, sign_date) VALUES (?, ?)";
$stmt = $pdo->prepare($insertSql);
$result = $stmt->execute([$userId, $today]);
if ($result) {
echo "签到成功";
} else {
echo "签到失败";
}
?>
连续签到统计
添加连续签到统计功能:
function getContinuousSignDays($userId, $pdo) {
$sql = "SELECT sign_date FROM sign_records
WHERE user_id = ?
ORDER BY sign_date DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute([$userId]);
$records = $stmt->fetchAll(PDO::FETCH_COLUMN);
$continuousDays = 0;
$yesterday = date('Y-m-d', strtotime('-1 day'));
foreach ($records as $date) {
if ($date == date('Y-m-d')) {
$continuousDays = 1;
} elseif ($date == $yesterday) {
$continuousDays++;
$yesterday = date('Y-m-d', strtotime($yesterday . ' -1 day'));
} else {
break;
}
}
return $continuousDays;
}
前端界面示例
创建签到按钮和显示界面sign_page.php:
<div class="sign-container">
<h3>每日签到</h3>
<button id="signBtn" class="btn btn-primary">立即签到</button>
<div id="signResult"></div>
<p>已连续签到 <span id="continuousDays">0</span> 天</p>
</div>
<script>
$(document).ready(function() {
$('#signBtn').click(function() {
$.post('sign.php', function(response) {
$('#signResult').html(response);
if (response.includes('成功')) {
location.reload();
}
});
});
});
</script>
签到奖励系统
可扩展添加奖励系统:
function giveSignReward($userId, $continuousDays, $pdo) {
$rewardPoints = 10; // 基础奖励
// 连续签到额外奖励
if ($continuousDays >= 7) {
$rewardPoints += 50;
} elseif ($continuousDays >= 3) {
$rewardPoints += 20;
}
// 更新用户积分
$updateSql = "UPDATE users SET points = points + ? WHERE id = ?";
$stmt = $pdo->prepare($updateSql);
$stmt->execute([$rewardPoints, $userId]);
return $rewardPoints;
}
安全注意事项
- 确保所有数据库操作使用预处理语句防止SQL注入
- 对用户身份进行严格验证
- 重要操作记录日志
- 考虑添加CSRF防护机制
以上实现方案可根据实际需求进行调整和扩展,例如添加月签到统计、签到排行榜等功能。







