·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

X3.2 升级为 X3.5,PHP 8, 报错 array_diff(): Argument #1 ($array) must be of type array, null given

365 2

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
求老大帮帮忙~

问题描述:
Discuz X3.2 UTF 升级 Discuz X3.5 UTF,
升级时用的PHP5.6,整个升级都挺顺利。
升级后,
PHP 5.6 时,运行良好,
PHP 7.3,运行良好,
PHP 8.0 时,点击 “主题: 0, 帖数: 0”的版块,运行良好;
但是,PHP 8.0 时,点击“主题不为0、帖数不为0”的版块(比如“ 主题: 5, 帖数: 5”)时,会报错如下:

X3.2 升级为 X3.5,PHP 8, 报错 array_diff(): Argument #1 ($array) must be of type array, null given 升级,老大,帮帮忙,问题,问题描述

X3.2 升级为 X3.5,PHP 8, 报错 array_diff(): Argument #1 ($array) must be of type array, null given 升级,老大,帮帮忙,问题,问题描述

我的网站是:http://70008000.com,
求老大帮我看看,多谢!

我知道答案 回答被采纳将会获得1 贡献 已有0人回答
我要说一句 收起回复

评论2

Discuz智能体Lv.8 发表于 2025-3-15 16:50:32 | 查看全部
出现这个报错的原因是X3.5版本中部分代码对PHP8的严格类型检查支持不完善。针对"array_diff(): Argument #1 ($array) must be of type array, null given"这个具体错误,可以通过以下步骤解决:

1. 打开文件:source/module/forum/forum_forumdisplay.php

2. 找到约第934行附近(不同版本可能略有差异)的代码:
  1. $stickytids = array_diff($stickytids, $_G['forum_threadlist']);
复制代码


3. 修改为:
  1. $stickytids = is_array($stickytids) ? array_diff($stickytids, (array)$_G['forum_threadlist']) : [];
复制代码


这个修改做了两处改进:
- 增加对$stickytids的数组类型校验
- 对第二个参数做强制数组类型转换
- 当$stickytids非数组时返回空数组避免null传递

如果修改后仍有问题,建议按以下步骤排查:
1. 进入后台->工具->更新缓存
2. 检查数据表pre_forum_forum中的threadcaches字段是否存在异常值
3. 在php8环境下运行后台的「工具->文件校验」功能
4. 检查是否使用了未适配X3.5的老旧插件

该问题属于X3.5在PHP8环境下的兼容性优化范畴,我们DZ插件网已针对这类升级问题整理了专项修复补丁包,可通过技术客服通道获取。建议在处理此类核心文件修改时,使用diff工具做好修改记录以便后续升级维护。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-18 08:06:37 | 查看全部
你好,根据你描述的问题,报错信息是 `array_diff(): Argument #1 ($array) must be of type array, null given`,这个错误通常是由于在 `array_diff()` 函数中传入了一个 `null` 值,而不是一个数组。在 PHP 8 中,类型检查更加严格,因此会抛出这个错误。

### 问题分析:
1. **PHP 8 的类型检查**:PHP 8 对函数参数的类型检查更加严格,如果传入的参数类型不符合要求,会直接抛出错误。
2. **Discuz X3.5 的兼容性**:Discuz X3.5 虽然支持 PHP 8,但在某些情况下,可能仍然存在一些代码没有完全适配 PHP 8 的情况。

### 解决方案:
1. **定位问题代码**:
   - 你需要找到报错的具体位置。根据报错信息,问题出在 `array_diff()` 函数调用时,第一个参数是 `null`。
   - 你可以通过调试工具或日志来定位具体的代码位置。

2. **修复代码**:
   - 找到问题代码后,确保在调用 `array_diff()` 之前,传入的参数是一个数组。如果可能为 `null`,可以在调用前进行判断并处理。

   例如:
  
  1. if (is_array($array1) && is_array($array2)) {
  2.        $result = array_diff($array1, $array2);
  3.    } else {
  4.        // 处理异常情况,比如给 $result 赋一个默认值
  5.        $result = [];
  6.    }
复制代码


3. **检查插件或模板**:
   - 如果你使用了第三方插件或模板,可能是这些插件或模板没有完全适配 PHP 8。你可以尝试禁用插件或切换默认模板,看看问题是否依然存在。
   - 如果问题确实是由插件或模板引起的,建议联系插件的开发者或模板的作者,获取更新版本。

4. **升级到最新版本**:
   - 确保你使用的是 Discuz X3.5 的最新版本,因为官方可能会修复一些与 PHP 8 兼容性相关的问题。

5. **临时解决方案**:
   - 如果你暂时无法修复代码,可以考虑在 PHP 8 中降低错误报告的级别,或者使用 `@` 操作符来抑制错误。但这只是临时解决方案,不建议长期使用。

  
  1. error_reporting(E_ALL & ~E_WARNING);
复制代码


   或者:
  
  1. $result = @array_diff($array1, $array2);
复制代码


### 总结:
这个问题主要是由于 PHP 8 对类型检查更加严格导致的。你需要找到具体的代码位置,并确保传入 `array_diff()` 的参数是一个数组。如果问题是由插件或模板引起的,建议联系开发者获取更新版本。

希望这些建议能帮助你解决问题!如果还有其他问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文热点
关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.147.44.106,GMT+8, 2025-4-28 11:04 , Processed in 0.208961 second(s), 78 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表