Header Location跳转失效问题:$inventory_id为空引发跳转失败
问题分析与解决方案
首先,你的代码里存在一个逻辑错误,这正是导致$inventory_id为空、跳转失效的核心原因:
你先执行了UPDATE语句,把匹配com_code='$conform'的记录的com_code设为NULL,紧接着又用同一个$conform值去查询com_code='$conform'——这时候这条记录的com_code已经是NULL了,自然查不到任何结果,$row为空,$inventory_id也就没有值,跳转的Location参数自然失效。
修复步骤
1. 调整执行顺序:先查询再更新
在执行UPDATE之前,先通过com_code='$conform'查询出对应的inventory_id,这样即使之后更新了com_code,也已经拿到了需要的跳转参数:
<?php include("myhomeportal/setting/config.php"); $conform = $_GET['conform-email']; // 先查询获取inventory_id $query = mysqli_query($conn, "SELECT inventory_id FROM item_users WHERE com_code='$conform'"); $row = mysqli_fetch_array($query); if ($row) { $inventory_id = $row['inventory_id']; // 执行更新操作 $sql = "UPDATE item_users SET com_code=NULL, type_login='user' WHERE com_code='$conform'"; $result = mysqli_query($conn, $sql) or die(mysqli_error()); // 跳转后必须终止脚本执行,避免后续代码干扰 header("Location: category.php?inventory_id=$inventory_id"); exit; } else { $msgerr = "无效的验证码"; echo "<script type='text/javascript'>alert('$msgerr');</script>"; } ?>
2. 修复SQL注入风险(重要)
你当前的代码直接把用户输入的$conform拼接到SQL语句中,存在严重的SQL注入漏洞,建议使用预处理语句来避免这个问题:
<?php include("myhomeportal/setting/config.php"); $conform = $_GET['conform-email']; // 预处理查询inventory_id $stmt = mysqli_prepare($conn, "SELECT inventory_id FROM item_users WHERE com_code=?"); mysqli_stmt_bind_param($stmt, "s", $conform); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $row = mysqli_fetch_array($result); if ($row) { $inventory_id = $row['inventory_id']; // 预处理更新语句 $updateStmt = mysqli_prepare($conn, "UPDATE item_users SET com_code=NULL, type_login='user' WHERE com_code=?"); mysqli_stmt_bind_param($updateStmt, "s", $conform); mysqli_stmt_execute($updateStmt); // 跳转前确保没有意外输出,开启缓冲区处理 ob_start(); header("Location: category.php?inventory_id=$inventory_id"); ob_end_flush(); exit; } else { $msgerr = "无效的验证链接"; echo "<script type='text/javascript'>alert('$msgerr');</script>"; } ?>
额外注意事项
- 跳转前确保没有任何输出(包括空格、换行),如果有意外输出,可以使用输出缓冲区
ob_start()和ob_end_flush()来处理。 - 执行
header()之后一定要加上exit;或die();,终止脚本继续执行,避免后续代码干扰跳转逻辑。
内容的提问来源于stack exchange,提问作者Pankaj
相关产品推荐
相关产品推荐

