错误原因

getCommentAt() 函数中,$arow 可能为 nullfalse(例如父评论不存在、未审核或数据库查询失败),但代码直接访问了 $arow['url']$arow['author'],导致 PHP 7.4+ 触发 “Trying to access array offset on value of type null” 警告。


修复方法

编辑文件 /www/wwwroot/blog.ziyege.com/usr/themes/HarmonyHues/core/function.php,找到 getCommentAt 函数(约第 402 行),将原代码:

php

if ($type == 'html') {
    echo '<span class="repy-to-author mr-1"><a href="' . $arow['url'] . '" title="' . $arow['author'] . '">@' . $arow['author'] . '</a>: </span>';
} elseif ($type == 'a') {
    echo '<a href="' . $arow['url'] . '" title="' . $arow['author'] . '">' . $arow['author'] . '</a>';
}

替换为:

php

if ($arow) {
    if ($type == 'html') {
        echo '<span class="repy-to-author mr-1"><a href="' . $arow['url'] . '" title="' . $arow['author'] . '">@' . $arow['author'] . '</a>: </span>';
    } elseif ($type == 'a') {
        echo '<a href="' . $arow['url'] . '" title="' . $arow['author'] . '">' . $arow['author'] . '</a>';
    }
}

完整修复后的函数示例

php

function getCommentAt($coid, $type = 'html')
{
    $db = Typecho_Db::get();
    $prow = $db->fetchRow(
        $db->select('parent')
            ->from('table.comments')
            ->where('coid = ? AND status = ?', $coid, 'approved')
    );
    $parent = $prow['parent'] ?? 0;
    if ($prow && $parent != '0') {
        $arow = $db->fetchRow(
            $db->select('author,url')
                ->from('table.comments')
                ->where('coid = ? AND status = ?', $parent, 'approved')
        );
        if ($arow) {
            if ($type == 'html') {
                echo '<span class="repy-to-author mr-1"><a href="' . $arow['url'] . '" title="' . $arow['author'] . '">@' . $arow['author'] . '</a>: </span>';
            } elseif ($type == 'a') {
                echo '<a href="' . $arow['url'] . '" title="' . $arow['author'] . '">' . $arow['author'] . '</a>';
            }
        }
    }
}

补充说明

  • 该错误仅在评论带有 @回复 且父评论数据异常时触发,不影响正常浏览。
  • 修复后,若父评论缺失或未审核,将不再输出 @作者 部分,避免页面报错。
  • 建议同时更新主题其他潜在未判空的位置(如 $socialArray 遍历、$cnavbarArray 遍历等),但当前错误仅由 getCommentAt 引起。