获取所有栏目的文档ID数的函数GetTotalArc($tid)

admin2019-12-23966

获取所有文档ID数量,例如,在一些网站上面有本站文章共有多少篇,软件共有多少个,图片共有多少组等,这样可以让用户一看就知道这个网站有多少资料。织梦里面也有类似的标签,

例如,统计网站共有多少文章标签:

{dede:sql sql="select count(*) as c from #@__archives where channel=1"}共有文章:[field:c /]篇{/dede:sql}

还有很多这样的标签,如果我们研究一下发现,这些织梦标签都是用的是sql语句直接查询数据库的。

今天介绍的函数,跟上面的函数类似,也是要用sql语句查询数据库,按照sql里面的group by 来实现按栏目分组,把每个栏目的id统计加起来,然后,再把所有的统计数相加,得到的结果便是所有文档的ID,这是这个函数的执行原理。

函数:UpdateCatalogNum(),GetTotalArc($tid)

函数所在文件:www.dedebase.com/inlude/typeunit.class.admin.php

要获取所有栏目的文档ID数,需要这二个函数配合使用才能实现这一功能。

函数UpdateCatalogNum()源码分析:

函数:

    function UpdateCatalogNum()
    {
        $this->dsql->SetQuery("SELECT typeid,count(typeid) as dd FROM `#@__arctiny` WHERE arcrank <>-2 group by typeid");
        $this->dsql->Execute();
        while($row = $this->dsql->GetArray())
        {
            $this->CatalogNums[$row['typeid']] = $row['dd'];
        }
    }

这个函数的功能就按照栏目id进行分组,然后,把浏览权限不为-2的栏目id和这个栏目id下面的所有文档,通过函数count()加起来,存放到dd里面,然后,通过while遍历,把每个栏目id对应的总文件数存放数组$thisk->CatalogNums里面,以备下面的函数调用使用。

在这个函数的中有几个地方不好理解,也是重点,就是arcrank<>-2,这种方法其实,在织梦系统里面有很多地方出现过,因为,浏览权限里面有0,-1和正数,如果把这些值都包括,那么,使用这种本来不存在的-2作为参照,是一个非常好的方法。

第二个不好理解的就是group by 其实,只要是学过sql的朋友,那么,对于这个分组就非常容易,就如同一个大学生看到1+1等于几的问题,但是,对于我们新朋友来说,这个东西可能不好理解。group by typeid意思是:按照相同栏目id进行分组,例如,栏目id都是1文档,全部分进一组里面。

函数GetTotalArc($tid)源码分析:

函数:

function GetTotalArc($tid)
    {
        if(!is_array($this->CatalogNums))
        {
            $this->UpdateCatalogNum();
        }
        if(!isset($this->CatalogNums[$tid]))
        {
            return 0;
        }
        else
        {
            $totalnum = 0;
            $ids = explode(',',GetSonIds($tid));
            foreach($ids as $tid)
            {
                if(isset($this->CatalogNums[$tid]))
                {
                    $totalnum += $this->CatalogNums[$tid];
                }
            }
            return $totalnum;
        }
    }

上面的那个函数,其实,只是对这个函数的一个准备,真正查询某个栏目的所有文档id是这个函数。

这个函数中前第一个if条件判断$this->CatalogNums是不是一个数组,若不是,则直接调用上面的函数UpdateCatalogNum(),因为,这个函数返回的是一个数组,如果不是,说明,没有调用这个函数,若者是其它原因。

第二个条件判断$this->CatalogNums[$tid]是判断若,传到进来的要获得文档数的栏目id没有设置,此时,直接返回0。这个是什么意呢?什么是没有设置,其实,就是没有通过$this->CatalogNums[$tid]进行调用的意思。

通过上面排除二个异常情况,下面程序就开始进行查询所有文档之和了。

通过$ids = explode(',',GetSonIds($tid))这一行代码,我们把要查询的栏目$tid的所栏目id取出来,存放到数组$ids里面。然后,遍历这个数组,然后,return $totalnum得到的结果就是栏目$tid所有文档id。

这个教程介绍的函数,准确地应当是获取某个栏目的所有文档,这样来理解函数就容易多了。


网友评论