1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Discuz-DiscuzX

 / Детали:

В файле forum_forumdisplay.php версии PHP 8.2 возникла ошибка несоответствия типов: Неподдерживаемые операнды: string...

Предстоит сделать
Владелец
Создано  
20.04.2025
  • int

Есть ли какие-либо отклики по этому вопросу?

  • Я уже провёл поиск и подтвердил, что этот вопрос не был ранее поднят другими пользователями.

Описание проблемы

Описание:
При запуске 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()

Скриншот ошибки### Попытки решения проблемы

Переключение на PHP 7.4 устраняет проблему.

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

Комментарий (0)

GitLife Service Account Задача создана

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/Discuz-DiscuzX.git
git@api.gitlife.ru:oschina-mirror/Discuz-DiscuzX.git
oschina-mirror
Discuz-DiscuzX
Discuz-DiscuzX