PHP通过工号查询用户SQL ID失败:数组偏移空值错误
问题修复方案
核心问题分析
- 传参错误:调用
findUserID时传入的是array_key_exists("collar", $_POST)的布尔值(true/false),而非POST中实际的工号内容,导致SQL查询的是collar = 1或collar = 0,无法匹配正确用户。 - 空结果未处理:当查询不到匹配用户时,
mysqli_fetch_array($result)返回null,直接访问$row['id']会触发trying to access array offset on value of type null错误。 - SQL注入风险:手动转义字符串存在潜在注入风险,预处理语句更安全。
修复后的代码
UpdatePassword.php
session_start(); include("functions.php"); $id = null; // 先判断工号是否存在,再传入实际值 if (array_key_exists("collar", $_POST)) { $id = findUserID($_POST['collar']); } // 输出结果,无匹配时提示 echo $id ?? "未找到对应用户ID";
Functions.php
function findUserID($collar){ include("../connection.php"); // 使用预处理语句避免SQL注入 $query = "SELECT `id` FROM `users` WHERE collar = ?"; $stmt = mysqli_prepare($link, $query); mysqli_stmt_bind_param($stmt, "s", $collar); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 仅当查询到结果时返回ID,否则返回null if ($row = mysqli_fetch_array($result)) { return $row['id']; } return null; }
修复说明
- 修正传参逻辑:先校验POST中是否存在
collar字段,再传入实际工号值,确保查询条件正确。 - 空结果处理:通过
if ($row = mysqli_fetch_array($result))判断是否有匹配行,避免访问null的数组偏移量。 - 安全优化:改用mysqli预处理语句,彻底规避SQL注入风险,比手动转义更可靠。
内容的提问来源于stack exchange,提问作者Welshy
相关产品推荐
相关产品推荐

