Prepared语句JSON编码返回空结果,报数组偏移访问空值错误求助
问题分析与修复方案
你的代码里有两个核心问题导致了空结果和错误提示,咱们一步步拆解解决:
1. 结果集处理逻辑错误
$stmt->get_result()返回的是一个**mysqli_result对象**,并非直接的行数据数组。你直接对这个对象调用json_encode(),PHP无法正确序列化数据库结果集对象,所以输出会是空值。
你需要先从结果集中提取实际的行数据,比如用fetch_assoc()方法获取关联数组:
if(isset($_POST["id"])){ $stmt = $mysqli->prepare("SELECT * FROM account WHERE id = ?"); $stmt->bind_param("s", $_POST["id"]); $stmt->execute(); $result = $stmt->get_result(); // 先拿到结果集对象 $row = $result->fetch_assoc(); // 从结果集中取出单行数据 echo json_encode($row); // 现在序列化数组就能正常输出了 }
2. "Trying to access array offset on value of type null"错误的根源
这个错误通常是因为当查询没有匹配到数据时,fetch_assoc()会返回null。如果后续代码里你尝试像访问数组一样调用$row['某个字段'],就会触发这个错误。
解决办法是先判断$row是否有效,再进行后续操作:
if(isset($_POST["id"])){ $stmt = $mysqli->prepare("SELECT * FROM account WHERE id = ?"); $stmt->bind_param("s", $_POST["id"]); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); if($row){ // 查询到数据时的处理 echo json_encode($row); } else { // 没有匹配数据时的处理,比如返回提示信息 echo json_encode(["message" => "No account found with this ID"]); } }
额外排查建议
- 开发环境下可以开启错误提示,方便快速定位问题:
error_reporting(E_ALL); ini_set('display_errors', 1); - 确认
$mysqli数据库连接是否成功,有时候连接失败也会导致后续操作返回null
内容的提问来源于stack exchange,提问作者newusertomysqli12
相关产品推荐
相关产品推荐

