PHP报错:trying to access array offset on value of type null 求助
嘿,我帮你揪出这个错误的根源啦!你遇到的 trying to access array offset on value of type null 问题,其实是结果集被提前耗尽导致的,跟你同时操作两张表无关,是代码执行顺序的问题~
问题本质
你看哦,你先调用了 mysqli_fetch_all($result, MYSQLI_ASSOC),这个函数会一次性把结果集里的所有数据都读取到数组里,读完之后,$result 这个结果集的指针就跑到末尾了,再也没有数据能读了。之后你又调用 mysqli_fetch_assoc($result),这时候函数只能返回 null——同理 $result2 也是一样的情况。当你试图访问 $shelfitem['parent_id'] 和 $shelfwebsite['folder'] 时,本质是在访问 null 的数组偏移,自然就抛出错误了。
两种修复方案
根据你的需求,给你两种可行的修复方式:
方案一:直接从全量数组取第一行(推荐)
如果你本来就想拿两张表的第一行数据存会话,那直接从已经获取的全量数组里取第一个元素就行,不用再调用 mysqli_fetch_assoc:
<?php session_start(); include('../includes/dbh.inc.php'); $sql = 'SELECT * FROM shelfitems'; $lqs = 'SELECT * FROM shelfwebsites'; $result = mysqli_query($conn, $sql); $result2 = mysqli_query($conn, $lqs); // 获取两张表的全量数据 $shelfitems = mysqli_fetch_all($result, MYSQLI_ASSOC); $shelfwebsites = mysqli_fetch_all($result2, MYSQLI_ASSOC); // 先判断数组是否为空,再取第一行,避免空数组报错 $shelfitem = !empty($shelfitems) ? $shelfitems[0] : []; $shelfwebsite = !empty($shelfwebsites) ? $shelfwebsites[0] : []; // 用空合并运算符处理可能的空值,避免存入null后后续报错 $_SESSION['parent_id'] = $shelfitem['parent_id'] ?? null; $_SESSION['folder'] = $shelfwebsite['folder'] ?? null; $parent_id = $_SESSION['parent_id']; $folder = $_SESSION['folder']; mysqli_close($conn);
方案二:先取单条数据,再拿全量数据
如果你既需要单条数据存会话,又需要保留全量数据数组,那就要调换顺序——先调用 mysqli_fetch_assoc 拿第一行,再调用 mysqli_fetch_all 拿剩下的所有数据:
<?php session_start(); include('../includes/dbh.inc.php'); $sql = 'SELECT * FROM shelfitems'; $lqs = 'SELECT * FROM shelfwebsites'; $result = mysqli_query($conn, $sql); $result2 = mysqli_query($conn, $lqs); // 先取第一行数据 $shelfitem = mysqli_fetch_assoc($result); $shelfwebsite = mysqli_fetch_assoc($result2); // 再读取结果集中剩下的所有数据 $shelfitems = mysqli_fetch_all($result, MYSQLI_ASSOC); $shelfwebsites = mysqli_fetch_all($result2, MYSQLI_ASSOC); // 同样做空值处理 $_SESSION['parent_id'] = $shelfitem['parent_id'] ?? null; $_SESSION['folder'] = $shelfwebsite['folder'] ?? null; $parent_id = $_SESSION['parent_id']; $folder = $_SESSION['folder']; mysqli_close($conn);
额外提醒
以后写数据库操作的时候,记得永远做空值判断!比如用 ?? 空合并运算符,或者提前判断数组是否为空,不然遇到表中没有数据的情况,还是会触发类似的错误哦~
内容的提问来源于stack exchange,提问作者elliec
相关产品推荐
相关产品推荐

