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

PHP请假审批SQL双表更新报错求助:扣除假期额度并更新状态

排查请假审批更新功能的报错问题

刚接触编程遇到这种问题很正常,咱们一步步拆解你代码里的问题:

1. 直接触发报错的SQL语法错误

你写的UPDATE语句里,SET子句最后一个字段后面多了个多余的逗号,比如:

user_info.sl_credit=user_info.sl_credit-1, WHERE id='$uid'

这个逗号会直接导致数据库解析SQL失败,这就是你看到"error updating table"的核心原因之一。

2. 多表UPDATE缺少关联逻辑

你同时更新tblleaves和user_info两个表,但没指定它们之间的关联关系——数据库根本不知道哪条user_info记录对应哪条请假申请,搞不好会误更新所有用户的额度,这非常危险!你需要通过用户ID来关联两张表(假设tblleaves里有记录申请人ID的字段,比如user_id)。

3. 条件判断逻辑完全错误

你的if条件用了||(逻辑或),比如:

if ($leavetype == "Sick Leave" || $status == "Approved")

这意味着只要是病假,不管状态是不是批准,都会执行扣除操作,完全不符合你"仅当获批时扣除额度"的需求。应该换成&&(逻辑与),表示只有请假类型匹配并且状态为批准时,才执行扣除操作。年假的判断同理。

4. 严重的SQL注入风险

你直接把用户输入的$uid、$adminremark等变量拼接到SQL语句里,这会让恶意用户轻易篡改数据库数据,必须用预处理语句来解决这个问题。


修正后的代码示例

我帮你调整了所有问题,你可以参考:

<?php
$uid = $_GET['ref'];
$leavetype = $_GET['leavetype'];
$adminremark = $_POST['adminremark'];
$status = $_POST['status'];
$date = date("Y-m-d H:i:s");

include '../db_config/connection.php';

// 初始化SQL变量
$sql = "";

// 修正条件判断为逻辑与,同时添加表关联(假设tblleaves有user_id字段关联user_info的id)
if ($leavetype == "Sick Leave" && $status == "Approved") {
    $sql = "UPDATE tblleaves 
            JOIN user_info ON tblleaves.user_id = user_info.id
            SET tblleaves.adminremark=?, tblleaves.status=?, tblleaves.adminremarkdate=?, user_info.sl_credit=user_info.sl_credit-1
            WHERE tblleaves.id=?";
} elseif ($leavetype == "Vacation Leave" && $status == "Approved") {
    $sql = "UPDATE tblleaves 
            JOIN user_info ON tblleaves.user_id = user_info.id
            SET tblleaves.adminremark=?, tblleaves.status=?, tblleaves.adminremarkdate=?, user_info.vl_credit=user_info.vl_credit-1
            WHERE tblleaves.id=?";
} else {
    // 非批准状态时,只更新请假表的字段
    $sql = "UPDATE tblleaves
            SET adminremark=?, status=?, adminremarkdate=?
            WHERE id=?";
}

// 使用预处理语句执行,避免SQL注入
if ($stmt = $conn->prepare($sql)) {
    // 根据不同SQL绑定对应参数(s=字符串,i=整数,需匹配数据库字段类型)
    if (($leavetype == "Sick Leave" || $leavetype == "Vacation Leave") && $status == "Approved") {
        $stmt->bind_param("sssi", $adminremark, $status, $date, $uid);
    } else {
        $stmt->bind_param("ssi", $adminremark, $status, $date, $uid);
    }
    
    if ($stmt->execute()) {
        header("location:leave-details.php?ref=$uid");
        exit(); // 跳转后立即退出,避免后续代码执行
    } else {
        echo "Error updating record: " . $stmt->error;
    }
    $stmt->close();
} else {
    echo "Error preparing statement: " . $conn->error;
}

$conn->close();
?>

额外提醒

  • 我假设tblleaves表中有user_id字段关联user_info的id,如果你的字段名不一样,记得改成你实际的字段名。
  • 跳转后加exit()是为了防止后续代码继续执行,避免出现意外输出影响跳转。

内容的提问来源于stack exchange,提问作者jackflick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:39:20