未定义数组索引这个错误在ThinkPHP框架见得非常多。因为引起这个错误的原因太常见了,比如你查询数据时,得到的数组索引没有你引用的索引那么就会提示这个错误。还有如果你查询到的数据为空时,但是你模板文件里却引用这个值也会提示这个错误。
所以避免这种错误的方法就是数据的完整性效验,先效验后引用的方式。
这次碰到这个错误提示比较奇怪,这套系统是别人写的,我也是帮朋友的忙接触过一次,首次安装调试是我做的,因为朋友找的人搞不定,我就接手安装了。
安装后交付给朋友使用后,就一直没再接触这套系统。
直到昨天出问题。因为系统之前用得好好的,突然就说不行了,问了下朋友执行了什么操作,朋友的回答原话是:
「添加分类了以后,点击确认然后一直卡在那里就崩溃了 」
那么,我首先想到的就是数据添加失败,写入脏数据了。
于是吧,连上阿里云后台,远程服务器,找到这套系统安装文件夹(因为只是临时维护下,所以没安装配置本机的调试环境,有什么问题直接上服务器),找到runtime下的log文件夹,查看日志,发现执行到这一句就卡住了:
[2022-04-08T17:34:52+08:00][sql] SELECT `id` FROM `tp_cate` WHERE `module_id` = 25 LIMIT 1 [ RunTime:0.000137s ]
顺藤摸瓜找打tp_cate表并且执行这条语句发现没有返回任何数据,因为没有数据所以报错了。
仔细看下这个表,发现最新添加的那条记录的module_id为0,这个不应该,这个字段按作用来讲不可能会0的,所以这个就是朋友说的卡住崩溃后的脏数据吧,不管他了,手动把这个字段值改为25.再刷新网页,正常了!
总结:
TP框架的log做得非常全,排查错误非常方便。灵活运用log日志定位问题很方便。
另外,引起TP框架提示「未定义数组索引:XXX」的原因基本上都是因为数据源问题。比如你查询的数组是$array['xx']['bbb'],而你访问的是$array['bbb']那么就会报错了