错误原因
在 getCommentAt() 函数中,$arow 可能为 null 或 false(例如父评论不存在、未审核或数据库查询失败),但代码直接访问了 $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引起。
暂无评论