当前位置:首页 > PHP

php实现打卡

2026-02-28 12:11:24PHP

PHP实现打卡功能

打卡功能通常涉及用户登录、记录时间、存储数据等步骤。以下是一个简单的PHP打卡实现方案:

数据库设计

创建一张表存储打卡记录,例如:

CREATE TABLE `check_in` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `check_in_time` datetime NOT NULL,
  `ip_address` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

用户认证

确保用户已登录才能打卡:

session_start();
if (!isset($_SESSION['user_id'])) {
    header('Location: login.php');
    exit;
}

打卡处理逻辑

创建check_in.php处理打卡请求:

php实现打卡

// 连接数据库
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');

// 防止重复打卡
$stmt = $db->prepare("SELECT * FROM check_in WHERE user_id = ? AND DATE(check_in_time) = CURDATE()");
$stmt->execute([$_SESSION['user_id']]);
if ($stmt->rowCount() > 0) {
    die('今日已打卡');
}

// 记录打卡
$stmt = $db->prepare("INSERT INTO check_in (user_id, check_in_time, ip_address) VALUES (?, NOW(), ?)");
$stmt->execute([
    $_SESSION['user_id'],
    $_SERVER['REMOTE_ADDR']
]);

echo '打卡成功';

前端界面

简单的HTML打卡按钮:

<form action="check_in.php" method="post">
    <button type="submit">每日打卡</button>
</form>

打卡记录查询

显示用户打卡历史:

$stmt = $db->prepare("SELECT * FROM check_in WHERE user_id = ? ORDER BY check_in_time DESC");
$stmt->execute([$_SESSION['user_id']]);
$records = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($records as $record) {
    echo date('Y-m-d H:i', strtotime($record['check_in_time'])).'<br>';
}

安全增强

添加CSRF防护:

php实现打卡

// 生成token
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

// 表单中加入
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

// 验证token
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die('非法请求');
}

扩展功能

  1. 连续打卡统计:

    $stmt = $db->prepare("
     SELECT COUNT(*) as days 
     FROM check_in 
     WHERE user_id = ? 
     AND check_in_time >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)
    ");
    $stmt->execute([$_SESSION['user_id']]);
    $continuous = $stmt->fetchColumn();
  2. 打卡提醒功能:

    
    $last_check = $db->query("
     SELECT MAX(check_in_time) 
     FROM check_in 
     WHERE user_id = ".$_SESSION['user_id']
    )->fetchColumn();

if (date('Y-m-d') > date('Y-m-d', strtotime($last_check))) { echo '今天尚未打卡'; }


3. 地理位置验证(可选):
```javascript
// 前端获取地理位置
navigator.geolocation.getCurrentPosition(function(position) {
    // 将坐标发送到后端验证
});

标签: php
分享给朋友:

相关文章

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'loca…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Rat…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $n…

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $…

php 实现队列

php 实现队列

PHP 实现队列的方法 PHP 可以通过多种方式实现队列功能,以下是几种常见的实现方法: 使用数组实现队列 PHP 数组可以通过 array_push 和 array_shift 函数模拟队列的先…