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=utf8mb4;
签到功能实现
<?php
// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
// 获取用户ID(假设从session获取)
$user_id = $_SESSION['user_id'];
// 检查今天是否已签到
$today = date('Y-m-d');
$stmt = $db->prepare("SELECT id FROM sign_in WHERE user_id = ? AND sign_date = ?");
$stmt->execute([$user_id, $today]);
if ($stmt->fetch()) {
echo "今日已签到";
} else {
// 执行签到
$stmt = $db->prepare("INSERT INTO sign_in (user_id, sign_date) VALUES (?, ?)");
if ($stmt->execute([$user_id, $today])) {
echo "签到成功";
} else {
echo "签到失败";
}
}
?>
连续签到功能扩展
// 获取连续签到天数
function getContinuousDays($db, $user_id) {
$stmt = $db->prepare("
SELECT COUNT(*) as days
FROM (
SELECT sign_date,
@date_group := IF(DATEDIFF(@prev_date, sign_date) = 1, @date_group, @date_group + 1) as date_group,
@prev_date := sign_date
FROM (SELECT sign_date FROM sign_in WHERE user_id = ? ORDER BY sign_date DESC) t,
(SELECT @date_group := 0, @prev_date := NULL) vars
) t
WHERE date_group = 1
");
$stmt->execute([$user_id]);
$result = $stmt->fetch();
return $result['days'] ?? 0;
}
签到奖励系统
// 根据连续签到天数发放奖励
$continuous_days = getContinuousDays($db, $user_id);
switch ($continuous_days) {
case 7:
addReward($user_id, '7天连续签到奖励');
break;
case 30:
addReward($user_id, '30天连续签到奖励');
break;
// 其他奖励规则...
}
function addReward($user_id, $reward_name) {
// 实现奖励发放逻辑
}
前端页面整合
<form method="post" action="sign_in.php">
<button type="submit">每日签到</button>
</form>
<p>连续签到天数: <?php echo getContinuousDays($db, $user_id); ?></p>
注意事项
- 确保用户认证系统已正确实现
- 考虑添加防刷机制,如IP限制
- 对于高并发场景,考虑使用Redis等缓存技术
- 定期清理或归档旧的签到记录







