PHP中常用的分页类总结
分页是目前在显示大量结果时所采用的最好的方式。有了下面这些代码的帮助,开发人员可以在多个页面中显示大量的数据。在互联网上,分页是一般用于搜索结果或是浏览全部信息
php基本分页
<?php // database connection info $conn = mysql_connect('localhost', 'dbusername', 'dbpass') or trigger_error("SQL", E_USER_ERROR); $db = mysql_select_db('dbname', $conn) or trigger_error("SQL", E_USER_ERROR); // find out how many rows are in the table $sql = "SELECT COUNT(*) FROM numbers"; $result = mysql_query($sql, $conn) or trigger_error("SQL", E_USER_ERROR); $r = mysql_fetch_row($result); $numrows = $r[0]; // number of rows to show per page $rowsperpage = 10; // find out total pages $totalpages = ceil($numrows / $rowsperpage); // get the current page or set a default if (isset($_GET['currentpage']) && is_numeric($_GET['currentpage'])) { // cast var as int $currentpage = (int)$_GET['currentpage']; } else { // default page num $currentpage = 1; } // end if // if current page is greater than total pages... if ($currentpage > $totalpages) { // set current page to last page $currentpage = $totalpages; } // end if // if current page is less than first page... if ($currentpage < 1) { // set current page to first page $currentpage = 1; } // end if // the offset of the list, based on current page $offset = ($currentpage - 1) * $rowsperpage; // get the info from the db $sql = "SELECT id, number FROM numbers LIMIT $offset, $rowsperpage"; $result = mysql_query($sql, $conn) or trigger_error("SQL", E_USER_ERROR); // while there are rows to be fetched... while ($list = mysql_fetch_assoc($result)) { // echo data echo $list['id'] . " : " . $list['number'] . "<br />"; } // end while /****** build the pagination links ******/ // range of num links to show $range = 3; // if not on page 1, don't show back links if ($currentpage > 1) { // show << link to go back to page 1 echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=1'><<</a> "; // get previous page num $prevpage = $currentpage - 1; // show < link to go back to 1 page echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$prevpage'><</a> "; } // end if // loop to show links to range of pages around current page for ($x = ($currentpage - $range); $x < (($currentpage + $range) + 1); $x++) { // if it's a valid page number... if (($x > 0) && ($x <= $totalpages)) { // if we're on current page... if ($x == $currentpage) { // 'highlight' it but don't make a link echo " [<b>$x</b>] "; // if not current page... } else { // make it a link echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$x'>$x</a> "; } // end else } // end if } // end for // if not on last page, show forward and last page links if ($currentpage != $totalpages) { // get next page $nextpage = $currentpage + 1; // echo forward link for next page echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$nextpage'>></a> "; // echo forward link for lastpage echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$totalpages'>>></a> "; } // end if /****** end build pagination links ******/ ?>
先看一个常用的php分页类
<?php /* Place code to connect to your DB here. */ include ('config.php'); // include your code to connect to DB. $tbl_name = ""; //your table name // How many adjacent pages should be shown on each side? $adjacents = 3; /* First get total number of rows in data table. If you have a WHERE clause in your query, make sure you mirror it here. */ $query = "SELECT COUNT(*) as num FROM $tbl_name"; $total_pages = mysql_fetch_array(mysql_query($query)); $total_pages = $total_pages[num]; /* Setup vars for query. */ $targetpage = "filename.php"; //your file name (the name of this file) $limit = 2; //how many items to show per page $page = $_GET['page']; if ($page) $start = ($page - 1) * $limit; //first item to display on this page else $start = 0; //if no page var is given, set start to 0 /* Get data. */ $sql = "SELECT column_name FROM $tbl_name LIMIT $start, $limit"; $result = mysql_query($sql); /* Setup page vars for display. */ if ($page == 0) $page = 1; //if no page var is given, default to 1. $prev = $page - 1; //previous page is page - 1 $next = $page + 1; //next page is page + 1 $lastpage = ceil($total_pages / $limit); //lastpage is = total pages / items per page, rounded up. $lpm1 = $lastpage - 1; //last page minus 1 /* Now we apply our rules and draw the pagination object. We're actually saving the code to a variable in case we want to draw it more than once. */ $pagination = ""; if ($lastpage > 1) { $pagination.= "<div class=\"pagination\">"; //previous button if ($page > 1) $pagination.= "<a href=\"$targetpage?page=$prev\">� previous</a>"; else $pagination.= "<span class=\"disabled\">� previous</span>"; //pages if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up { for ($counter = 1; $counter <= $lastpage; $counter++) { if ($counter == $page) $pagination.= "<span class=\"current\">$counter</span>"; else $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>"; } } elseif ($lastpage > 5 + ($adjacents * 2)) //enough pages to hide some { //close to beginning; only hide later pages if ($page < 1 + ($adjacents * 2)) { for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++) { if ($counter == $page) $pagination.= "<span class=\"current\">$counter</span>"; else $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>"; } $pagination.= "..."; $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>"; $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>"; } //in middle; hide some front and some back elseif ($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2)) { $pagination.= "<a href=\"$targetpage?page=1\">1</a>"; $pagination.= "<a href=\"$targetpage?page=2\">2</a>"; $pagination.= "..."; for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++) { if ($counter == $page) $pagination.= "<span class=\"current\">$counter</span>"; else $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>"; } $pagination.= "..."; $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>"; $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>"; } //close to end; only hide early pages else { $pagination.= "<a href=\"$targetpage?page=1\">1</a>"; $pagination.= "<a href=\"$targetpage?page=2\">2</a>"; $pagination.= "..."; for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++) { if ($counter == $page) $pagination.= "<span class=\"current\">$counter</span>"; else $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>"; } } } //next button if ($page < $counter - 1) $pagination.= "<a href=\"$targetpage?page=$next\">next �</a>"; else $pagination.= "<span class=\"disabled\">next �</span>"; $pagination.= "</div>n"; } ?> <?php while ($row = mysql_fetch_array($result)) { // Your while loop here } ?> <?php echo $pagination ?> 实例 <?php class PageView { /**页码**/ public $pageNo = 1; /**页大小**/ public $pageSize = 20; /**共多少页**/ public $pageCount = 0; /**总记录数**/ public $totalNum = 0; /**偏移量,当前页起始行**/ public $offSet = 0; /**每页数据**/ public $pageData = array(); /**是否有上一页**/ public $hasPrePage = true; /**是否有下一页**/ public $hasNextPage = true; public $pageNoList = array(); public $jsFunction = 'jsFunction'; /** * * @param unknown_type $count 总行数 * @param unknown_type $size 分页大小 * @param unknown_type $string */ public function __construct($count = 0, $size = 20, $pageNo = 1, $pageData = array() , $jsFunction = 'jsFunction') { $this->totalNum = $count; //总记录数 $this->pageSize = $size; //每页大小 $this->pageNo = $pageNo; //计算总页数 $this->pageCount = ceil($this->totalNum / $this->pageSize); $this->pageCount = ($this->pageCount <= 0) ? 1 : $this->pageCount; //检查pageNo $this->pageNo = $this->pageNo == 0 ? 1 : $this->pageNo; $this->pageNo = $this->pageNo > $this->pageCount ? $this->pageCount : $this->pageNo; //计算偏移 $this->offset = ($this->pageNo - 1) * $this->pageSize; //计算是否有上一页下一页 $this->hasPrePage = $this->pageNo == 1 ? false : true; $this->hasNextPage = $this->pageNo >= $this->pageCount ? false : true; $this->pageData = $pageData; $this->jsFunction = $jsFunction; } /** * 分页算法 * @return */ private function generatePageList() { $pageList = array(); if ($this->pageCount <= 9) { for ($i = 0; $i < $this->pageCount; $i++) { array_push($pageList, $i + 1); } } else { if ($this->pageNo <= 4) { for ($i = 0; $i < 5; $i++) { array_push($pageList, $i + 1); } array_push($pageList, -1); array_push($pageList, $this->pageCount); } else if ($this->pageNo > $this->pageCount - 4) { array_push($pageList, 1); array_push($pageList, -1); for ($i = 5; $i > 0; $i--) { array_push($pageList, $this->pageCount - $i + 1); } } else if ($this->pageNo > 4 && $this->pageNo <= $this->pageCount - 4) { array_push($pageList, 1); array_push($pageList, -1); array_push($pageList, $this->pageNo - 2); array_push($pageList, $this->pageNo - 1); array_push($pageList, $this->pageNo); array_push($pageList, $this->pageNo + 1); array_push($pageList, $this->pageNo + 2); array_push($pageList, -1); array_push($pageList, $this->pageCount); } } return $pageList; } /*** * 创建分页控件 * @param * @return String */ public function echoPageAsDiv() { $pageList = $this->generatePageList(); $pageString = "<div class='pagination'><div class='page-bottom'>"; if (!empty($pageList)) { if ($this->pageCount > 1) { if ($this->hasPrePage) { $pageString = $pageString . "<a class='page-next' href="javascript:" .$this->jsFunction . "(" . ($this->pageNo-1) . ") ">上一页</a>"; } foreach ($pageList as $k => $p) { if ($this->pageNo == $p) { $pageString = $pageString . "<span class='page-cur'>" . $this->pageNo . "</span>"; continue; } if ($p == - 1) { $pageString = $pageString . "<span class='page-break'>...</span>"; continue; } $pageString = $pageString . "<a href=\"javascript:" . $this->jsFunction . "(" . $p . ")\">" . $p . "</a>"; } if ($this->hasNextPage) { $pageString = $pageString . "<a class='page-next' href=\"javascript:" . $this->jsFunction . "(" . ($this->pageNo + 1) . ")\">下一页</a>"; } } } $pageString = $pageString . ("</div></div>"); return $pageString; } } ?>
css代码
<style type="text/css"> <!-- .pagination {font-family: Tahoma;overflow: hidden; padding-top: 12px; text-align: center;} .pagination-tab { margin-bottom: 20px;} .pagination a, .pagination .page-cur, .pagination .page-prev_g, .pagination .page-prev, .pagination .page-next, .pagination .page-next_g, .pagination .page-break, .pagination .page-skip { display: inline-block;font-family: Tahoma,SimSun,Arial; height: 22px;line-height:22px; margin: 0; min-width: 16px;padding: 0 5px; text-align: center; vertical-align: top; white-space: nowrap;} .pagination a, .pagination .page-prev_g, .pagination .page-prev, .pagination .page-next, .pagination .page-next_g, .pagination .page-cur, .pagination .page-break { border: 1px solid #ed3d83; color:#e9357d; font-weight:bold;} .pagination a:hover { border: 1px solid #ed3d83;text-decoration: none; background-color:#f95f9d; color:#fff;} .pagination .page-prev_g, .pagination .page-prev, .pagination .page-next, .pagination .page-next_g { width: 36px; background-image: url(../static/img/page.gif);} .pagination .page-prev { background-position: -0px -38px; padding-left: 16px;} .pagination .page-prev_g { background-position:0px -59px; padding-left: 16px; color:#cbcbcb; font-weight:normal;} .pagination .page-next { background-position: 0px 0px; padding-right: 16px; font-weight:normal;} .pagination .page-next_g { background-position: -0px -19px; padding-right: 16px; color:#cbcbcb;} .pagination .page-cur {background-color: #f95f9d; border: 1px solid #ed3d83;color: #fff;font-weight: bold;} .pagination .page-break {border: medium none; background:none transparent; color:#333;} -->
</style>
在php页面中的调用方法
<?php $pageNo = $_GET['pageNo']; if (empty($pageNo)) { $pageNo = 1; } //分页数据 $pageData = News::getNewsPage($pageNo, $pageSize); //取得总行数 $count = News::getNewsCount(); //创建分页器 $p = new PageView($count['0']['TOTAL'], $pageSize, $pageNo, $pageData); //生成页码 $pageViewString = $p->echoPageAsDiv();
文章网址:http://www.phprm.com/frame/php1005338.html
随意转载^^但请附上教程地址。