如何从数据库获取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
相关产品推荐
相关产品推荐

