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

PHP通过工号查询用户SQL ID失败:数组偏移空值错误

问题修复方案

核心问题分析

  1. 传参错误:调用findUserID时传入的是array_key_exists("collar", $_POST)的布尔值(true/false),而非POST中实际的工号内容,导致SQL查询的是collar = 1或collar = 0,无法匹配正确用户。
  2. 空结果未处理:当查询不到匹配用户时,mysqli_fetch_array($result)返回null,直接访问$row['id']会触发trying to access array offset on value of type null错误。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:40:21