You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP请假管理系统:关联两表计算并更新剩余年假天数

请假管理系统跨表更新年假天数解决方案

我正在开发一款请假管理系统,管理员创建员工账号时,会在staff表中默认添加年假天数。当员工提交的请假申请获批后,需要将leave表中的leave_days_taken(已请假天数)从staff表的leave_days(年假天数)中扣除,并更新staff表的leave_days字段。目前卡在如何关联两张表、跨表计算数值并最终更新staff表的年假天数上,相关信息如下:

表结构

Staff表结构

staff_id
firstname
lastname
username
dob
doa
password
leave_days

Leave表结构

leaveid
staffid
date_issued
leave_days_taken
status

现有approve.php代码

<?php
session_start();

//Getting leaveid from /leave page
$leaveid = $_GET['leaveid'];

//DB Connection
$conn = mysqli_connect('localhost', 'root', '','leavemanagement');
//If approve button was clicked

//Update the status column
$sql = "UPDATE `leave` SET status = 'Approved' WHERE leaveid = '$leaveid'";
$query = mysqli_query($conn, $sql);

if($query == true){?>
    <script>
        alert("Leave request has been approved");
        window.location.href = 'leave.php';
    </script>
<?php
} else{ ?>
    <script>
        alert("Leave request has not been approved");
        window.location.href = 'leave.php';
    </script>
  <?php  } ?>

解决方案

要实现审批后扣除年假的功能,需先获取当前请假申请对应的员工ID和请假天数,再关联staff表完成更新,同时修复SQL注入风险:

修改后的approve.php代码

<?php
session_start();

// 校验请假申请ID有效性
if (!isset($_GET['leaveid']) || empty($_GET['leaveid'])) {
    echo "<script>alert('无效的请假申请ID'); window.location.href='leave.php';</script>";
    exit;
}

$leaveid = $_GET['leaveid'];
$conn = mysqli_connect('localhost', 'root', '', 'leavemanagement');

// 预处理查询,获取当前请假申请的员工ID和请假天数
$stmt = $conn->prepare("SELECT staffid, leave_days_taken FROM `leave` WHERE leaveid = ?");
$stmt->bind_param("i", $leaveid);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows === 0) {
    echo "<script>alert('未找到对应的请假申请'); window.location.href='leave.php';</script>";
    exit;
}

$leaveData = $result->fetch_assoc();
$staffid = $leaveData['staffid'];
$daysTaken = $leaveData['leave_days_taken'];

// 开启事务,保证两个操作原子性
$conn->begin_transaction();

try {
    // 更新请假申请状态为已批准
    $stmt = $conn->prepare("UPDATE `leave` SET status = 'Approved' WHERE leaveid = ?");
    $stmt->bind_param("i", $leaveid);
    $stmt->execute();

    // 扣除员工对应年假天数
    $stmt = $conn->prepare("UPDATE staff SET leave_days = leave_days - ? WHERE staff_id = ?");
    $stmt->bind_param("di", $daysTaken, $staffid);
    $stmt->execute();

    // 提交事务
    $conn->commit();
    echo "<script>alert('请假申请已批准,年假已更新'); window.location.href='leave.php';</script>";
} catch (Exception $e) {
    // 操作失败回滚事务
    $conn->rollback();
    echo "<script>alert('操作失败:" . $e->getMessage() . "'); window.location.href='leave.php';</script>";
}

$conn->close();
?>

关键说明

  • 表关联逻辑:通过leave表的leaveid定位到对应申请,获取staffid和leave_days_taken,再用staffid关联staff表执行年假扣除操作。
  • 事务保障:使用数据库事务确保“更新请假状态”和“扣除年假”两个操作同时成功或失败,避免数据不一致。
  • 安全防护:全程使用mysqli预处理语句,避免直接拼接用户输入导致的SQL注入风险。

内容的提问来源于stack exchange,提问作者Arthur Sven Msiska

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:12:49