php 签到功能实现
PHP 签到功能实现
实现一个基本的签到功能需要处理用户身份验证、签到记录存储以及防止重复签到等问题。以下是实现步骤:
数据库设计 创建一张签到记录表,例如:
CREATE TABLE `sign_records` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`sign_date` date NOT NULL,
`sign_time` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_date` (`user_id`,`sign_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
签到处理逻辑
// 假设用户已登录,获取用户ID
$userId = $_SESSION['user_id'];
// 获取当前日期
$today = date('Y-m-d');
$now = date('Y-m-d H:i:s');
// 检查今天是否已签到
$checkSql = "SELECT id FROM sign_records WHERE user_id = ? AND sign_date = ?";
$stmt = $pdo->prepare($checkSql);
$stmt->execute([$userId, $today]);
if ($stmt->fetch()) {
echo "今天已经签到过了";
} else {
// 插入签到记录
$insertSql = "INSERT INTO sign_records (user_id, sign_date, sign_time) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($insertSql);
$stmt->execute([$userId, $today, $now]);
echo "签到成功";
}
连续签到统计 如果需要实现连续签到统计功能:
// 获取最近签到记录
$sql = "SELECT sign_date FROM sign_records
WHERE user_id = ?
ORDER BY sign_date DESC
LIMIT 7";
$stmt = $pdo->prepare($sql);
$stmt->execute([$userId]);
$records = $stmt->fetchAll(PDO::FETCH_COLUMN);
// 计算连续签到天数
$continuousDays = 1;
$previousDate = date('Y-m-d', strtotime($today . ' -1 day'));
for ($i = 0; $i < count($records); $i++) {
if ($records[$i] == $previousDate) {
$continuousDays++;
$previousDate = date('Y-m-d', strtotime($previousDate . ' -1 day'));
} else {
break;
}
}
签到奖励系统 可以根据连续签到天数给予不同奖励:
if ($continuousDays >= 7) {
// 给予7天连续签到奖励
$reward = 50;
} elseif ($continuousDays >= 3) {
$reward = 20;
} else {
$reward = 10;
}
// 更新用户积分
$updateSql = "UPDATE users SET points = points + ? WHERE id = ?";
$stmt = $pdo->prepare($updateSql);
$stmt->execute([$reward, $userId]);
安全注意事项
- 确保用户认证有效,防止未登录用户签到
- 使用预处理语句防止SQL注入
- 考虑添加CSRF保护
- 对于高并发场景,可以使用事务或锁机制
以上代码提供了PHP实现签到功能的基本框架,可根据实际需求进行调整和扩展。







