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
相关产品推荐
相关产品推荐

