wp升级了php版本到8.0,发现后台又出现了bug:Trying to access array offset on value of type null,也是醉了!

然后打断点找到问题所在位置:

$attachment_id_sang = media_handle_upload( 'sang', 0 ); //上传图片,返回的是 附件的ID

         
media_handle_upload方法是用来上传图片,(int|WP_Error) 成功返回附件ID,失败返回wp_error错误对象。
所以升级之后返回的都是wp_error,打印是一个数组array,里面有error信息

换个思路,是不是没用找到input的name导致的,不能捕获到这个name="sang"的内容?

然后测试一下,先判断这个属性input出现的前提条件:

if(!empty( $_POST["sangFlag"] ) && get_option("sangFlag") == 1){
    $attachment_id_sang = media_handle_upload( 'sang', 0 ); //上传图片,返回的是 附件的ID

然后再获取上传,保存之后发现报错消失了。卧槽,还真是这个原因!
php8.0报错:Trying to access array offset on value of type null-Qui-Note

结论:

页面里面的输入框是动态渲染的,当没有渲染时,php直接获取输入框的file文件并上传,会找不到这个输入框。这个时候就会返回一个wp_error对象object。并抛出异常:Trying to access array offset on value of type null。我是爱分享爱折腾的陈小知,感谢你的阅读。

以为就这样解决了问题,可是七娃又没有想到,用户后台切换开关,渲染之后依旧会报同样的错误,看来我并没有从根本上解决问题。

然后继续尝试度娘的方案:isset()

使用isset先判断值不为null,满足条件的话再更新图片。代码如下:

 if(isset($_POST['sangwx'])){
        $attachment_id_sang1 = media_handle_upload( 'sangwx', 0 ); //上传图片,返回的是 附件的ID
        if(gettype($attachment_id_sang1)!='object'){
            $sang_url1 = wp_get_attachment_url($attachment_id_sang1); //获取 图片的地址
        }
        if(!empty($sang_url1)){
             update_option("sangwx_img",$sang_url1); //如果图片地址在在,就将图片的地址写入到数据库
        }
}  

php8.0报错:Trying to access array offset on value of type null-Qui-Note
终于解决了!太难了,对于没有php基础了,改这些问题,完全靠猜。