【问题标题】:Is there any simple pagination framework for php which can be easily implementable?是否有任何简单的 php 分页框架可以轻松实现?
【发布时间】:2015-04-02 07:03:54
【问题描述】:

我的数据库中的表很少,并且想为页面上的多个表实现分页。 我在每个需要的页面中编写了自己的分页代码。 是否有任何可以轻松实现的框架,例如,当我将查询传递给一个方法或类时,它必须生成具有适当分页的 ui。是否有任何机构建议我执行此任务的任何框架。

编辑: 我已经指定我为分页编写了自己的代码,这与 @veerendra 给出的一种解决方案非常接近,但是对于 60 个不同页面中的分页,我需要编写该逻辑。 我要求一个框架来减轻我编写动态分页代码的负担,它应该在 php 中而不是 jquery 或 javascript 中。 由于他们的逻辑将驻留在客户端,因此无法对大量数据进行操作。

【问题讨论】:

  • 希望我的详细回答能帮助您实现分页:)

标签: php mysql dynamic mysqli pagination


【解决方案1】:

下面是名为 paging.inc.php 的文件

您只需将 where 类传递给查询,只需要获取计数并将计数变量命名为与文件中相同的名称,然后您将需要设置每页记录和其他参数。

在此之后,您需要触发查询,该查询将从文件中获取带有限制变量的记录,这可用于对列表中的列进行排序。

<?
//CODE FOR PAGING 
if(!isset($num_totrec))  $num_totrec = $db_recs[0]["tot"];

   //$num_totrec SHOULD BE PASSED
if(!isset($pg_limit) && empty($pg_limit))
   $pg_limit    = $PAGE_LIMIT; //page limit

if(!isset($rec_limit) && empty($rec_limit))
   $rec_limit   = $REC_LIMIT;  //record limit

if($_REQUEST["TotalRecords"]!="")
    $rec_limit  = $_REQUEST["TotalRecords"];

$num_tmp    = 0;
$var_flg    = "0";
$var_limit  = "";
$num_limit  = 0; 
$var_filter = "";

if($_GET[start]=='')    {$_GET[start] = 1;$start=1;}
if(($_GET[start]-1)*$rec_limit > $num_totrec)
{
    $_GET[start]=1;
    $start=1;
}

if(isset($tempvar) && !empty($tempvar))
{
    if($stat==1 && $tempvar == "true") $stat=0;
    else if($stat==0 && $tempvar == "true") $stat=1;
    else $stat=1;
}

$sort_order = ($stat==1)? $asc_order:$desc_order;
$sort_img = "<img src='$sort_order' border='0'>";

$var_filter = ""; 
$var_filter = "&stat=$stat";

//CODE FOR COLUMN SHOULD SORT ASCENDING/DESCENDING - END

   //CHANGE THIS CODE WITH SUITABLE VARIABLES

    if(isset($ptype)) $var_filter.= "&ptype=".$ptype."&action=Section";

    foreach ($_GET as $key=>$val)
    {
        if($key != "stat" && $key != "start" && $key != "nstart" && $key != "tempvar" && $key != "sorton")
        {
            if(is_array($val))
            {
                for($k=0;$k<count($val);$k++)
                {
                    $var_filter .= '&'.$key.'[]=' . $val[$k];
                }
            }else if($key == "keyword"){
                $var_filter.= "&$key=". stripcslashes($val);
            }
            else
                $var_filter.= "&$key=$val";
        }
    }


    foreach ($_POST as $key=>$val)
    {
        if($key != "stat" && $key != "start" && $key != "nstart" && $key != "tempvar" && $key != "sorton")
        {
            if(is_array($val))
            {
                for($k=0;$k<count($val);$k++)
                {
                    $var_filter .= '&'.$key.'[]=' . $val[$k];
                }
            }else if($key == "keyword"){
                $var_filter.= "&$key=". stripcslashes($val);
            }
            else
                $var_filter.= "&$key=$val";
        }
    }// end

      if(isset($month_val) && $month_val != "") $var_filter.= "&month_val=$month_val";
      if(isset($year_val) && $year_val != "") $var_filter.= "&year_val=$year_val";
      if(isset($action) && $action != "") $var_filter.= "&action=$action";

   //SET Extra querystring variables to pass from here
   //$var_extra can be attached with the links for this purpose

   if(isset($start)){
       $num_limit = ($start-1)*$rec_limit;
       $var_limit = " LIMIT $num_limit,$rec_limit"; 
   }else $var_limit = " LIMIT 0,$rec_limit";

   if(!isset($nstart)){
       if($num_totrec){ //if recs exists!!
           if($rec_limit>$num_totrec){
               $num_pgs = 1;
               $var_flg = "2";
           }else{
               $num_loopctr =0;
               $num_loopctr = ceil($num_totrec/$rec_limit);
               if($pg_limit>$num_loopctr){
                  $num_pgs = $num_loopctr;
                  $var_flg = "2";
               }else{
                  $num_pgs = $pg_limit;
                  if($num_totrec<=($rec_limit*$pg_limit)) $var_flg = "2";
           else $var_flg = "1";
               }
           }
           $var_link = "";
           $var_prevlink ="";
           //if sorting is set
           $var_sort_link="";
           if(isset($sorton)) $var_sort_link = "&sorton=$sorton";

           $var_prevlink ="<font size=1 color=black>&nbsp;&nbsp;|";
           for($i=1;$i<=$num_pgs;$i++)
           {
              IF($i==1)
                $var_link.= "<font size=1 color=red>$i</font>&nbsp;|&nbsp;";
            else

              $var_link.= "<a href=\"$var_self$PHP_SELF?nstart=1&start=$i$var_filter$var_sort_link$var_extra\"><font size=1 color=black>$i</font></a>&nbsp;|&nbsp;";
           }
           if($var_flag !="0" and $var_flg!="2"){ $var_link .= "&nbsp;>&nbsp;<a href=\"$var_self$PHP_SELF?nstart=2&start=$i$var_filter$var_filter$var_sort_link$var_extra\"><font size=1 color=black>next</font></a>"; }else {$var_link .= " </font>";
           }
           $page_link = "";
           $page_link = "$var_prevlink $var_link";
       }else{ 
         //IF NO RECORDS EXISTS!!
         $var_link="";
       }
   }else{ //if nstart is set
       if($num_totrec){ //if recs exists!!
           $num_loopctr =0;
           $num_rem_rec = 0;
           $num_rem_rec = ($num_totrec-(($nstart-1)*$rec_limit*$pg_limit));
           $num_loopctr = ceil($num_rem_rec/$rec_limit);
           $num_tmp = $rec_limit*$nstart*$pg_limit;
           if($num_tmp>$num_totrec){
               $num_pgs = $num_loopctr;
               $var_flg = "2";
           }else{
               $num_pgs = $pg_limit;
               if($num_totrec==($nstart*$rec_limit*$pg_limit)) $var_flg = "2";
               else $var_flg = "1";
           }
           $var_link = "";
           $var_prevlink ="";
           //if sorting is set
           $var_sort_link="";
           if(isset($sorton)) $var_sort_link = "&sorton=$sorton";
           $num_prevnstart = 0;
           $num_prevstart = 0;
           $num_prevnstart = $nstart-1;
           $num_prevstart = ($nstart*$pg_limit)-$pg_limit;
           $num_tmp = ($num_totrec/$rec_limit);
           if($nstart<=1) $var_prevlink ="<font size=1 color=black>&nbsp;|";
           else $var_prevlink ="<a href=\"$var_self$PHP_SELF?nstart=$num_prevnstart&start=$num_prevstart$var_filter$var_sort_link$var_extra\"><font size=1 color=black>prev</font></a>&nbsp;<font size=1 color=black><&nbsp;|</font>";  
           for($i=1;$i<=$num_pgs;$i++)
           {
              $num_start =  $num_prevstart+$i;
              $num_nstart = $nstart+1;

              IF($start==$num_start)
                $var_link.= "<font size=1 color=red>$num_start</font>&nbsp;|&nbsp;";
              else
                 $var_link.= "<a href=\"$var_self$PHP_SELF?nstart=$nstart&start=$num_start$var_filter$var_sort_link$var_extra\"><font size=1 color=black>$num_start</font></a>&nbsp;|&nbsp;";

           }
           $num_start++;
           if($var_flag!="0" and $var_flg!="2"){ $var_link .= "&nbsp;><a href=\"$var_self$PHP_SELF?nstart=$num_nstart&start=$num_start$var_filter$var_sort_link$var_extra\"><font size=1 color=black>next</font></a></font>"; }else {$var_link .= "<font size=1 color=black>&nbsp;</font>";
           }
           $page_link = "";
           $page_link = "$var_prevlink $var_link";
       }else{ 
         //IF NO RECORDS EXISTS!!
         $var_link="";
       }
  }

//if set the paging variables
if(isset($nstart)) $var_pgs = "&nstart=$nstart&start=$start"; //attach this with the sorting links  
//CODE FOR PAGING ENDS OVER HERE
?>

在下面发布示例代码,以便您可以了解我在上面的描述中所说的内容。

这只是我如何使用它的一个示例。

$where_arr = array();

if($keyword !=""){
    $where_arr[] ="$option like '".$keyword."%'";
}

if(count($where_arr)>0)
    $where_clause = " WHERE ".implode(" AND ", $where_arr);
else
    $where_clause = '';


$table_clause = " from admin";

$sql = "select count(iAdminId) as tot ".$table_clause.$where_clause;
$rs_sql = $sqlObj->select($sql);
$num_totrec = $rs_sql[0]['tot'];

include("gen_pagingmsg.inc.php");

if($sorton != "")
{
    switch ($sorton)
    {   
        case "1":
            $sort = "vUserName";
            if($stat!=1) $sort .= " DESC";
            break;
        case "2":
            ($stat==1)? $sort = "vFirstName, vLastName" : $sort = "vFirstName desc, vLastName DESC";
            break;
        case "3":
            $sort = "vEmail";
            if($stat!=1) $sort .= " DESC";
            break;
        case "4":
            $sort = "dLastAccess";
            if($stat!=1) $sort .= " DESC";
            break;
        case "5":
            $sort = "iTotLogin";
            if($stat!=1) $sort .= " DESC";
            break;
        case "6":
            $sort = "eStatus";
            if($stat!=1) $sort .= " DESC";
            break;
        default:
            $sort ="vUserName";
    }
}else {
    $sort ="vUserName";
}

$sql = "select iAdminId, concat(vFirstName, ' ', vLastName) as vName, vUserName, vEmail, dLastAccess, iTotLogin, eStatus ".$table_clause.$where_clause." order by ".$sort.$var_limit;
//echo "<br>".$sql;
$db_sql = $sqlObj->select($sql);

下面是 gen_pagingmsg.inc.php

<?
# =========================================================================
# Paging Paging comes from this File. Don't Remove this below line.
# =========================================================================
//echo $num_totrec;
//ECHO $rec_limit ;
if($ADMIN_SHOWPAGING_TOP=="N" && $ADMIN_SHOWPAGING_BOTTOM=="N")
    $rec_limit=$num_totrec;

include("paging.inc.php");
# =========================================================================

//$keyword = stripcslashes($keyword);

if($keyword!="")
{ 
    $var_msg="Your search for #keyword# has found #num_totrec# matches:";
    $var_msg=str_replace("#keyword#","<font color=#000000>$keyword</font>",$var_msg);
    $var_msg=str_replace("#num_totrec#","<font color=#000000>$num_totrec</font>",$var_msg);
}
if(!isset($start))
    $start = 1;
$num_limit = ($start-1)*$rec_limit;
$startrec = $num_limit;
$lastrec = $startrec + $rec_limit;
$startrec = $startrec + 1;
if($lastrec > $num_totrec)
    $lastrec = $num_totrec;
if($num_totrec > 0 )
{
    $recmsg = "Showing ".$startrec." - ".$lastrec." Records Of ".$num_totrec;
}
else
{
    $recmsg="Sorry !... No Records Found";
}
?>

此文件主要为您提供消息和分页 html,您可以将其保留在列表的上方或下方

【讨论】:

  • @Chella 谢谢,总是乐于提供帮助。它对你有用吗?
【解决方案2】:

您可以使用 jquery 分页,它简单快捷。请按照我已经深入描述的以下步骤进行操作

获取包含插件和 CSS 主题 here 的 zip。

第 1 步:与 JQuery 一起,在您的页面中包含 jquery.simplePagination.js:

<script type="text/javascript" src="path_to/jquery.js"></script>
<script type="text/javascript" src="path_to/jquery.simplePagination.js"></script>

建议使用 JQuery 1.7.2 或更高版本。旧版本可能也可以,但我还没有测试过。

第 2 步:可选 - 包含具有 3 个默认主题的 CSS 文件

<link type="text/css" rel="stylesheet" href="path_to/simplePagination.css"/>

如果跳过此步骤,则需要定义自己的样式或使用Bootstrap

第 3 步:在分页占位符上调用函数:

$(function() {
    $(selector).pagination({
        items: 100,
        itemsOnPage: 10,
        cssStyle: 'light-theme'
    });
});

如果需要,您可以直接通过“pages”参数指定页数,而不是插件用来自动计算页数的“items”和“itemsOnPage”。

可用选项

items 整数 默认值:1 将用于计算页面的项目总数。

itemsOnPage 整数 默认值:1 每页显示的项目数。

pages Integer Optional 如果指定,items 和 itemsOnPage 将不用于计算页数。

displayedPages 整数 默认值:5 导航时应显示多少页码。

允许的最小值:3(上一个、当前和下一个) edge 整数 默认值:2 在分页的开头/结尾处可见多少页码。

currentPage 整数 默认值:1 初始化后将立即选择哪个页面。

hrefTextPrefix String 默认值:“#page-” 用于构建 href 属性的字符串,添加在页码之前。

hrefTextSuffix 字符串 默认值:空字符串 另一个用于构建 href 属性的字符串,添加在页码之后。

prevText String 默认值:“Prev” 上一个按钮上显示的文本。

nextText String 默认值:“Next” 在下一个按钮上显示的文本。

labelMap Array 默认值:空数组 将用于呈现分页项的标签集合,替换数字。 cssStyle String 默认值:“light-theme” CSS 主题的类。

selectOnClick 布尔默认值:true 如果您不想在点击后立即选择页面,请设置为 false。

onPageClick(pageNumber, event) Function Optional 页面被点击时调用的函数。

页码和事件是可选参数。 onInit Function 可选 分页初始化时调用的函数。

可用方法

selectPage - 根据页码选择页面。

$(function() {
    $(selector).pagination('selectPage', pageNumber);
});

prevPage - 选择上一页。

$(function() {
    $(selector).pagination('prevPage');
});

nextPage - 选择下一页。

$(function() {
    $(selector).pagination('nextPage');
});

getPagesCount - 返回总页数。

$(function() {
    $(selector).pagination('getPagesCount');
});

getCurrentPage - 返回当前页码。

$(function() {
    $(selector).pagination('getCurrentPage');
});

disable - 禁用分页功能。

$(function() {
    $(selector).pagination('disable');
});

启用 - 在之前禁用后启用分页。

$(function() {
    $(selector).pagination('enable');
});

destroy - 视觉上销毁分页,保留所有现有设置。

$(function() {
    $(selector).pagination('destroy');
});

redraw - 使用现有设置再次绘制分页。 (例如,在您销毁分页后很有用)

$(function() {
    $(selector).pagination('redraw');
});

updateItems - 允许动态更改分页渲染的项目数

$(function() {
    $(selector).pagination('updateItems', 100);
});

updateItemsOnPage - 允许动态更改每个页面上呈现的项目数

$(function() {
    $(selector).pagination('updateItemsOnPage', 20);
});

drawPage - 将页码作为参数,并将“currentPage”值设置为给定的页码并绘制分页

$(function() {
    $(selector).pagination('drawPage', 5);
});

【讨论】:

  • 感谢您的详细回答,但我怀疑它是否适用于数百万条记录的大型数据集
  • @Chella 对于数百万记录,您需要遵循基于 php 的方法,我有一个现成的 php 分页类,它非常好,并且可以轻松处理数百万记录,因为它只获取每页记录。如果您愿意,我可以为该文件发布另一个答案以及如何使用它的一些提示
  • 能否请您帮助我使用基于 php 的方法,将其写在新答案中,以便较早的答案/方法对其他人也有用。
  • @Chella 我已经发布了一个新答案,试图解释所有事情,请尝试研究文件,你会明白
【解决方案3】:

check datatables 它是一个很棒的 js 表格框架,它允许你 实现 ajax 调用。

【讨论】:

  • 作为javascript中的数据表逻辑,不适合大数据集..!当我对大量数据进行操作时,页面加载会很慢
  • @Chella 我必须同意 talsibony,datables 提供了一个带有演示脚本的服务端处理,所有可以处理大量数据的都是参考datatables.net/manual/server-side
  • @Talsibony:谢谢,我之前没有看到数据表的这一面。我以为它会纯粹在客户端运行。非常感谢
【解决方案4】:

试试下面这个链接,用分页显示数据:

http://code.tutsplus.com/tutorials/how-to-paginate-data-with-php--net-2928

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    相关资源
    最近更新 更多