php实现签到功能实现
实现签到功能的基本思路
PHP实现签到功能通常涉及数据库记录、时间判断和用户交互。核心逻辑包括检查用户是否已签到、记录签到日期、更新连续签到天数等。
数据库设计
创建用户签到表,示例结构如下:
CREATE TABLE `user_check_in` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`check_date` date NOT NULL,
`continuous_days` int(11) DEFAULT 1,
PRIMARY KEY (`id`),
UNIQUE KEY `user_date` (`user_id`,`check_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
签到核心代码实现
// 连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 获取当前用户ID(实际应从会话获取)
$user_id = $_SESSION['user_id'] ?? 0;
$today = date('Y-m-d');
// 检查今日是否已签到
$stmt = $pdo->prepare("SELECT * FROM user_check_in WHERE user_id = ? AND check_date = ?");
$stmt->execute([$user_id, $today]);
if ($stmt->rowCount() > 0) {
echo "今日已签到";
exit;
}
// 获取昨天日期
$yesterday = date('Y-m-d', strtotime('-1 day'));
// 检查昨天是否签到
$stmt = $pdo->prepare("SELECT continuous_days FROM user_check_in WHERE user_id = ? AND check_date = ?");
$stmt->execute([$user_id, $yesterday]);
$continuous_days = 1;
if ($row = $stmt->fetch()) {
$continuous_days = $row['continuous_days'] + 1;
}
// 记录签到
$stmt = $pdo->prepare("INSERT INTO user_check_in (user_id, check_date, continuous_days) VALUES (?, ?, ?)");
$stmt->execute([$user_id, $today, $continuous_days]);
echo "签到成功,连续签到{$continuous_days}天";
签到奖励处理
根据连续签到天数发放不同奖励:
// 在签到成功后添加奖励逻辑
$reward = 0;
if ($continuous_days >= 7) {
$reward = 100;
} elseif ($continuous_days >= 3) {
$reward = 50;
} else {
$reward = 10;
}
// 更新用户积分
$stmt = $pdo->prepare("UPDATE users SET points = points + ? WHERE id = ?");
$stmt->execute([$reward, $user_id]);
echo "获得{$reward}积分奖励";
月度签到统计实现
查询当月签到情况:
$month = date('Y-m');
$stmt = $pdo->prepare("SELECT check_date FROM user_check_in
WHERE user_id = ? AND check_date LIKE ?");
$stmt->execute([$user_id, "{$month}%"]);
$checked_dates = [];
while ($row = $stmt->fetch()) {
$checked_dates[] = $row['check_date'];
}
// 生成当月日历视图
$days_in_month = date('t');
for ($day = 1; $day <= $days_in_month; $day++) {
$date = $month . '-' . str_pad($day, 2, '0', STR_PAD_LEFT);
$checked = in_array($date, $checked_dates) ? '已签' : '未签';
echo "{$day}号: {$checked}<br>";
}
安全注意事项
- 验证用户身份,防止未授权签到
- 使用预处理语句防止SQL注入
- 考虑服务器时区设置,确保日期判断准确
- 重要操作记录日志
以上代码提供了PHP实现签到功能的基本框架,可根据实际需求扩展积分系统、补签功能等高级特性。







