同福

做个web框架(22)——TFDO增加fetchTotal和fetchPart方法【20210105】

介绍

介绍

今天福哥带着大家给TFPHP框架的TFDO对象增加两个新方法——fetchTotal和fetchPart。这个fetchTotal方法用来获得输入SQL语句查询结果的记录集总数,而fetchPart方法用来从输入SQL语句查询结果的记录集里提取一部分记录出来。

一般情况下这两个方法可以用来实现功能列表的数据分页功能,这个数据分页功能在各种网站平台上随处可见,这种开放给用户的功能模块里面的数据的数量会随着用户的使用不断提高,如果不进行分页处理的话,在一个页面下面将无法展示这些数据了。

所谓的数据分页简单来说就是:根据一个页面可显示的最多记录数量(page size)将查询结果的记录集总数(total)等分成若干份,每一份就是一页数据,这个份数就是数据列表的页数(page total)。我们一次取出其中一份数据展示给用户,这一份的数字就是页码(page number)。取出来的这一份数据的第一行在整个记录集的位置叫做搜寻开始位置(seek begin),取出来的这一份数据的记录数量叫做提取数量(fetch numbers)。

可以很容易理解,我们得到了上面的六个参数之后,我们就可以把任意多的查询结果像图书一样分隔成一页一页的形式展示给用户了。

TFDO

路径

TFPHP\Database\SQL

代码

fetchTotal

public function fetchTotal(string $a,array $b=null):int{
    switch($this->c){
        case TFDO::T_MYSQL:$a=preg_replace("/[\s\t\r\n]+order[\s\t\r\n]+by[\s\t\r\n]+.*$/i","",$a);
        if(preg_match("/[\s\t\r\n]+group[\s\t\r\n]+by[\s\t\r\n]/i",$a)){
            $a="SELECT COUNT(*) AS TFDO_fetchTotal FROM  ( ".$a." ) AS TFDO_fetchTotal_".substr(md5(microtime()),rand(0,24),8);
        }
        else{
            $a=preg_replace("/SELECT[\s\t\r\n]+(.*)[\s\t\r\n]+FROM/i","SELECT COUNT(*) AS TFDO_fetchTotal FROM",$a);
        }
        break;
        default:throw new\Exception("invalid type of driver of TFDO",10001001);
    }
    $c=$this->fetchOne($a,$b);
    if($c!=null&&isset($c['TFDO_fetchTotal'])){
        return intval($c['TFDO_fetchTotal']);
    }
    return-1;
}

fetchPart

public function fetchPart(string $a,int $b,int $c,array $d=null):?array{
    switch($this->c){
        case TFDO::T_MYSQL:$a.=" LIMIT ".$b.",".$c;
        break;
        default:throw new\Exception("invalid type of driver of TFDO",10001001);
    }
    $e=$this->fetchAll($a,$d);
    return $e;
}

讲解

TFDO

fetchTotal

这个方法可以自动将输入SQL语句转换成基于COUNT语句的求总查询语句,并且自动提交查询语句获取查询结果的总数

fetchPart

这个方法可以自动使用输入参数拼凑出获取查询结果的记录集的一部分数据的SQL语句,并且自动进行查询返回查询结果的部分数据。

使用

代码

2fd967d5f0bdf837.jpg

效果

498aa4625bbc4d97.jpg

总结

福哥今天带着童鞋们给我们的TFPHP框架增加了两个方法——fetchTotal和fetchPart,使用这两个方法可以方便地完成功能列表的数据分页功能。这里面还缺少一个数据分页的算法功能,计算分页数量、搜寻开放位置、提取数量等等参数。

下一课,我们将实现数据分页对象TFDataPage,并且带着大家实现TFUMS系统的用户列表功能~~