问题
今天在打开ZBlog网站分类时,突然发现一个分类打开提示“Undefined array key 0”,打开里边的文章也都提示“Undefined array key 0”
解决方法
方法1.
经过百度搜索后,发现邓草博客有一篇名为“Z-BlogPHP显示错误Undefined array key 0 (set_error_handler)的解决办法”(https://5300.cn/blog/21)的文章提供了一种方法如下:
今天打开博客的时候,意外发现页面,打开均显示错误:Undefined array key 0 (set_error_handler)。
博客程序采用的是Z-BlogPHP。百度了一圈没有找到解决办法,在官方论坛里也没找到解决办法。
于是开始自己排查原因。我服务器采用的PHP8.0,主题:CMS文章模板(作者: 老白)。
排查步骤一:通过观察发现,某些不含有二级分类的分类页面,以及发布到这些分类的文章,打开均含有这个错误,而那些有二级分类的,打开就不显示这个错误,初步判断应该是模板语法写得不规范导致不兼容PHP8的问题。
于是,自己手工在这些错误的文章所在的分类下添加了下级分类,此时错误消失。
但没多久,即使有下级分类,错误又再一次重现,说明不是缺乏二级分类这个原因。
排查步骤二:在后台切换为官方默认模板,发现没有任何错误,说明了错误确实出现在这个模板上面。
于是在后台设置调试模式,发现错误描述为:
文件位置:zb_users/theme/yd0825/functions/Common.php 出错在第16行。
13 if (isset($related->Metas->pic)) {
14 $thumb = $related->Metas->pic;
15 } elseif ( isset($matchContent[1][0]) || $related->ImageCount >= '1' ) {
16 $thumb = $matchContent[1][0];
17 } else {
18 if ($zbp->Config('yd0825')->noimgstyle == '1') {
19 $thumb = $zbp->Config('yd0825')->noimg;
20 }elseif($zbp->Config('yd0825')->noimgstyle == '2'){
21 $thumb=$zbp->host . "zb_users/theme/" .$zbp->theme. "/include/random/" .$temp. ".jpg";
好家伙,原来是获取文章缩略图时出错了。我想不明白的是,第15行,既然“isset($matchContent[1][0])”这个条件都不能满足的话,直接使用“$matchContent[1][0]”又怎么可能获取到值啊!啥逻辑啊?于是,打开这个Common.php源文件,直接将15行代码修改为:
} elseif ( isset($matchContent[1][0]) ) {
刷新页面,错误消失,至此问题解决了。
想用这个模板的朋友不妨试试。如果要官方的解决方法,只能等模板作者来修复这个BUG了。
修改后的代码为:
题外话:随便看了源码发现还有一个明显的BUG。
在zb_users/theme/yd0825/functions/Common.php 文件的第9行也存在明显的BUG:
$pattern = "/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png]))[\'|\"].*?[\/]?>/";
看到没?这个正则写得也有问题,难道图片URL的格式就.gif、.jpg和.png这三种?事实上你转载别的网站的文章,图片格式远远多于这三种,而且还有很多链接的图片URL是没有后缀的。
我的博客之所以出现错误,问题的原因就是刚好那个分类下有2篇文章的图片是外链且没有图片后缀的。
至此,出现问题的BUG真相大白了。
方法2.
但是由于我用的主题和上边的主题不一致,我用的是李洋博客开发的“希望”主题,所以没有试上边的方法,自己经过摸索又发现了一种方法,不需要改任何代码,也可以消除错误,恢复正常,而且任何主题都可以试一下,方法如下:
- 通过“文章管理“”批量修改问题分类下的文章分类(可通过对应的插件给后台“文章管理”界面增加“批量修改文章分类”功能),筛选出是哪篇文章出的问题,进入该文章编辑界面,修改该文章分类为其他分类,再提交,一般就解决问题了。
- 如果还是出现问题,多用几次“批量修改文章分类”功能修改该问题文章的分类,然后再进入该文章编辑界面,修改该文章分类为其他分类,就可以了。
- 并且之后再把该文章修改回原来的分类,也不会再出现错误。
Comments NOTHING