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

如何从数据库获取user_id?解决空值数组偏移访问报错

解决「Trying to access array offset on value of type null」报错及IP查询用户的问题

报错原因

你遇到的第34行报错,本质是mysqli_fetch_array($result)返回了null——也就是说,用当前获取的IP在user_table里查不到对应的用户记录。常见诱因有这几个:

  • 用户IP未正确存入数据库
  • getIPAddress()获取的IP和数据库里存储的格式/内容不一致(比如IPv4/IPv6差异、代理IP导致的偏差)
  • 数据库查询本身执行失败(比如连接中断、SQL语法错误)

解决方案

1. 先做查询有效性校验,避免直接访问null

在读取user_id之前,先判断查询结果是否存在,同时修复原代码的SQL注入漏洞(直接拼接IP到SQL语句存在极高安全风险):

<?php
$user_ip = getIPAddress();
// 先确认数据库连接正常
if (!$con) {
    die("数据库连接失败: " . mysqli_connect_error());
}
// 用预处理语句防止SQL注入
$get_user = "select * from `user_table` where user_ip=?";
$stmt = mysqli_prepare($con, $get_user);
mysqli_stmt_bind_param($stmt, "s", $user_ip);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$run_query = mysqli_fetch_array($result);

// 处理无用户的情况,比如跳转到登录页
if ($run_query) {
    $user_id = $run_query['user_id'];
} else {
    header("Location: login.php");
    exit();
}
?>

2. 排查IP获取与存储的一致性

  • 先打印获取到的IP:var_dump($user_ip);,确认是不是你预期的地址
  • 查看user_table中user_ip字段的存储格式,确保和获取的IP格式匹配(比如不要存储带端口的地址,IPv6要统一格式)
  • 如果用户通过代理访问,getIPAddress()可能需要调整逻辑(比如优先读取HTTP_X_FORWARDED_FOR头),但要注意该头可能被伪造,需做安全校验

3. 页面中兜底处理

如果不想直接跳转页面,也可以在输出user_id时增加判断,避免空值输出:

<a href="order.php?user_id=<?php echo isset($user_id) ? htmlspecialchars($user_id) : '' ?>"><h2 class="text-center">pay offline</h2></a>

(htmlspecialchars用于防止XSS攻击)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:05:21