php取分表数据的简单实现

<?php
// error_reporting(E_ALL^E_NOTICE);
require_once './source/class/class_core.php';
require_once libfile('function/core');
$discuz = C::app();
$discuz->init_cron = false;
$discuz->init_setting = true;
$discuz->init_user = true;
$discuz->init_session = false;
$discuz->init();

$posttable = array('0'=>'pre_forum_post');
foreach(C::t('forum_post')->show_table() as $table) {
    list($tempkey, $tablename) = each($table);

    $tableid = substr($tablename, strrpos($tablename, '_') + 1);
    if (!preg_match('/^\d+$/', $tableid)) {
        continue;
    }
    $posttable[$tableid] = $tablename;

}

foreach($posttable as $key=>$ptable)
{
    $sql = "select count(*) as total from {$ptable}";
    $temp = DB::fetch_first($sql);
    $tableidpagearr[$key] = $temp['total'];
}

var_dump($tableids);
var_dump($tableidpagearr);


$perpage = 10;
$nowpage = 23;
// $tableidpagearr = array(15,30,40);
$ft = gettablepage($perpage,$nowpage,$tableidpagearr);
echo "<pre>";
print_r($ft);



$allresult = array();
foreach($ft as $key=>$sqllimit) {
    $sql = "select * from {$posttable[$key]} {$sqllimit}";
    echo $sql."<br>";
    $result = DB::fetch_all($sql);

    $allresult = array_merge($allresult,$result);

}

var_dump($allresult);



function gettablepage($perpage,$nowpage,$tableidpagearr) {
    $totalnum = 0;
    $mpage =0;
    $mappage = array();
    foreach($tableidpagearr as $key=>$num) {
        $temp = array_slice($tableidpagearr,0,$key+1);
        $totalnum = array_sum($temp);//总条数累加
        $pagetotal[$key] = intval($totalnum/$perpage);//总页数
        $temppagetotal = $pagetotal[$key]-$pagetotal[$key-1];//后面的总页数-前一个的总页数
        // var_dump($temppagetotal);continue;
        $countnum = ($totalnum%$perpage)?$temppagetotal+1:$temppagetotal;
        if (isset($mappage[$key-1])&&($mpage=max(array_keys($mappage[$key-1])))&&$mappage[$key-1][$mpage]<$perpage) {
            $startpage = $mpage;//上一个分表的最大分页
        } else {
            $startpage = $mpage+1;//上一个分表的最大分页+1 刚好
        }

        for ($i=$startpage;$i<$startpage+$countnum;$i++) {

            if ($i<$startpage)continue;
            if (isset($mappage[$key-1][$i])&&$mappage[$key-1][$i]<$perpage) {//头
                $mappage[$key][$i] = $perpage-$mappage[$key-1][$i];
            } else if ($i==$startpage+$countnum-1&&$totalnum%$perpage) {//尾
                $mappage[$key][$i] = $totalnum%$perpage;
            } else {
                $mappage[$key][$i] = $perpage;//中间

            }

            $offset = $mappage[$key][$i-1]?$mappage[$key][$i-1]:0;
            if ($mpage == $i) {$offset=0;$a=0;}
            $a = $a+intval($offset);
            $mappageoffset[$key][$i]=  $a;
        }
    }
    // var_dump($mappage);
    // var_dump($mappageoffset);
    foreach($mappage as $tableid=>$page) {
        if (in_array($nowpage,array_keys($page))) {
            $ft[$tableid] = "limit {$mappageoffset[$tableid][$nowpage]},{$page[$nowpage]}";//当前分表 多少条数据

        }
    }

    return $ft;
}


转载于:https://my.oschina.net/u/731817/blog/229133

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值