Описание:
При запуске Discuz! X3.5 в окружении PHP 8 возникает ошибка при доступе к определённому разделу форума:
Unsupported operand types: string + int
Ошибка происходит на строке 862 файла source/module/forum/forum_forumdisplay.php:
$_G['forum_threadlist'][$index]['views'] += $value['addviews'];
Причина проблемы:
Изначальное значение $_G['forum_threadlist'][$index]['views'] может быть пустой строкой или нечисловым значением, что не позволяет PHP 8 выполнять неявное преобразование в целое число.
Проблема возникает, когда в таблице forum_threadaddviews есть кэшированные данные для определённого списка тем;
подробнее в обсуждении на форуме Tianwai Piao Xian
Текущие проблемные страницы:
https://www.dianbo.org/forum.php?mod=forumdisplay&fid=7&page=14
https://www.dianbo.org/forum.php?mod=forumdisplay&fid=7&filter=reply&orderby=replies&page=7
https://www.dianbo.org/forum.php?mod=forumdisplay&fid=7&filter=author&orderby=dateline&page=9
https://www.dianbo.org/forum.php?mod=forumdisplay&fid=7&filter=reply&orderby=views&page=13
www.dianbo.org - Системная ошибка
Unsupported operand types: string + int
PHP Debug
Номер Файл Строка Код
1 forum.php 71 require()
2 source/module/forum/forum_forumdisplay.php 862 break()
### Попытки решения проблемы
AI предложил следующее решение:
Убедиться, что переменные являются целочисленными перед выполнением операции сложения:
$_G['forum_threadlist'][$index]['views'] = (int)$_G['forum_threadlist'][$index]['views'] + (int)$value['addviews'];
AI предложил ещё одно решение (начиная с строки 857):
if (!empty($threadids)) {
$indexlist = array_flip($threadids);
// Инициализация поля views в $_G['forum_threadlist']
foreach ($_G['forum_threadlist'] as &$thread) {
$thread['views'] = isset($thread['views']) ? (int)$thread['views'] : 0;
}
unset($thread);
// Обработка дополнительных просмотров
foreach (C::t('forum_threadaddviews')->fetch_all($threadids) as $tidkey => $value) {
$index = $indexlist[$tidkey]; // Убедитесь в типовой безопасности
$threadlist[$index]['views'] = (int)$threadlist[$index]['views'] + (int)$value['addviews'];
$_G['forum_threadlist'][$index]['views'] = (int)$_G['forum_threadlist'][$index]['views'] + (int)$value['addviews'];
}
}
Проблема исчезает при использовании приведенного выше кода.
Системная информация
Discuz! Версия программы
Discuz! X3.5 Release 20250205 UTF-8
UCenter Версия клиента UCenter 1.7.0 Release 20250205
Система сервера и PHP Linux(Linux) / PHP 8.2.27 / fpm-fcgi
Серверное программное обеспечение nginx/1.26.3
Версия MySQL сервера 10.6.20-MariaDB-log
Максимальный размер загрузки 50М
Обсуждение на официальном форуме: https://www.dismall.com/thread-25632-1-1.html
X3.5