在使用DEDECMS(织梦系统)进行网站开发时,从V5版本开始,系统增强了对SQL注入的安全检查机制。这一改动虽然提高了系统的安全性,但也导致了一些正常的子查询SQL无法执行。例如,在统计当前栏目及其所有子栏目的文章总数时可能会遇到问题。为了解决这个问题,可以通过自定义函数来实现所需功能。 以下是一个解决方案,您可以将相关代码添加到/include/common.func.php 或 /include/extend.func.php 文件中。这样,您就可以在模板中调用 getTotalArcByTid(1) 来获取指定栏目及其子栏目的文章总数。

/* 
* 返回符合记录的文章数量 
* @description DEDE不允许执行子查询,解决栏目下文章统计的问题 
* @param $level 为真时查询所有子类目 
* */ 
function getTotalArcByTid($tid, $level=TRUE) { 
    global $dsql; 
    $level==TRUE && $tid = GetSonTypeID($tid); 
    $sql = "SELECT count(id) as total from `dede_archives` where typeid in($tid)"; 
    $result = $dsql->GetOne($sql); 
    return $result['total']; 
} 

/* 
* 递归获取符合条件的子栏目 
* @param $tid 栏目ID 
* @return string 
* */ 
function GetSonTypeID($tid) 
{ 
    global $dsql; 
    $dsql->SetQuery("Select id From `dede_arctype` where reid in($tid) And ishidden<>1 order by sortrank"); 
    $dsql->Execute($tid); 
    $typeid = ''; 
    while($row=$dsql->GetObject($tid)) 
    { 
        $typeid .= "{$row->id},"; 
        $typeid .= GetSonTypeID($row->id); 
    } 
    return trim($typeid,','); 
}
    

调用方法:

在模板中调用该方法通常可以采用以下方式之一:

{dede:field.typeid function="getTotalArcByTid(@me)"/}

或者

[field:typeid function="getTotalArcByTid(@me)"/]

通过上述方法,您可以轻松地在DEDECMS中实现对当前栏目及所有子栏目文章总数的统计。这种方法不仅解决了因安全检查增强而带来的限制,还保持了代码的简洁性和可维护性。
确保您的文件路径和函数名称正确无误,以便顺利运行这些自定义函数。此外,定期备份您的网站文件和数据库,以防止意外修改导致的数据丢失。