效果图: 可根据姓,名,年龄排序,右下角是下拉分页跳转 与改变每页显示的记录数:
<?php
include ("connDB.php");
session_start();
/*
* Pagenation:
* defalut $page_num = 20 // 默认每页显示 20 条记录
* $page : the page to be display // 显示数据页
* $url : the page call this function // 调用页面
*/
function pagenation($page_num=20,$page,$url,$SQL){
// 定义三个全局变量,数据输出的页面会用到:
global $rows,$result,$navigator;
// 首先,取得所有的行数:
$result_All=mysql_query($SQL);
$total_rows=mysql_num_rows($result_All);
// 解析传过来的URL,取得操作的参数
$url_string=parse_url($_SERVER["REQUEST_URI"]);
$query_string=$url_string["query"];
$page_string=explode('=',$query_string);
$page_type=$page_string[0]; // 传过来的变量 order[排序] , num[每页要显示的记录数], page_no[页数]
$page=$page_string[1]; // 对应值 asc , desc, 10-50, 页数
// 如果是更改每页的记录数:将每页显示的记录数存进 session 里,页数归一
if($page_type=="num") {
$_SESSION["page_num"]=$page;
$page=1;
}
// 如果已经有了,则取出来用
if(isset($_SESSION["page_num"])) $page_num=$_SESSION["page_num"];
/*
* 对传过来的$page进行判断,是分页还是排序:
* 升序与 降序:把条件存进 session里,分页时调用
* 如果有多个条件,则用 switch 来判断
*/
switch($page){
case "aASC": // 按年龄升序
$_SESSION["order"]=" ORDER BY age ASC";
break;
case "aDESC": // 按年龄降序
$_SESSION["order"]=" ORDER BY age DESC";
break;
case "lASC": // 按姓升序
$_SESSION["order"]=" ORDER BY lastname ASC";
break;
case "lDESC": // 按姓降序
$_SESSION["order"]=" ORDER BY lastname DESC";
break;
case "fASC": // 按名升序
$_SESSION["order"]=" ORDER BY firstname ASC";
break;
case "fDESC": // 按名降序
$_SESSION["order"]=" ORDER BY firstname DESC";
break;
// 分页或第一次查看:取得页数
default:
$page=(integer)($page);
}
// 如果没有给定 page 或 page不为整数[asc 或 desc], 则设为第一页: 从第一页开始计算
if(!is_integer($page) ||!$page)
$page=1;
// Calculator Total pages:
$total_pages=ceil($total_rows/$page_num);
// 把条件加上去:如果是第一次查看,则 $_SESSION["order"]为空,不起作用
$SQL.=$_SESSION["order"];
// 计算有多少页:
$start_num=$page_num * ($page-1);
// 正式分页:
$SQL.=" LIMIT $start_num,$page_num";
print("SQL in pagenation is : ".$SQL."<BR><BR>");
$result=mysql_query($SQL) or die(mysql_error());
$rows=mysql_num_rows($result);
// 输出导航代码 Navigator:
// Check $total_page: 检查总页数,如果为 0 或为 1,则上一页下一页均为一
if($total_pages==0 ||$total_pages==1){
$Previous=1;
$Next=1;
}
// Previous: 上一页
($page==1)?$Previous=1:$Previous=$page-1;
// Next: 下一页
($page==$total_pages)?$Next=$total_pages:$Next=$page+1;
// Display: OK ,输出
$All="$total_rows All ";
$First="<a href=$url?page_no=1>First</a>";
$Previous="<a href=$url?page_no=$Previous>Previous</a>";
$Next="<a href=$url?page_no=$Next>Next</a>";
$Last="<a href=$url?page_no=$total_pages>Last</a>";
$Current=" Current: " .$page. "/" .$total_pages;
// 下拉跳转功能 goToPage() 在 $url 页面定义,很简单
$Goto=" GOTO:<SELECT NAME=select_page onChange=goToPage(this.value)>";
for($i=1;$i<=$total_pages;$i++){
if($page==$i)
$Goto.="<OPTION VALUE=$i selected>$i";
else
$Goto.="<OPTION VALUE=$i>$i";
}
$Goto.="</SELECT>";
// 可以选择每页显示多少条纪录:changeNum() 在调用分页函数的页面里定义:
$perPage=" Rcds/page: <select id=num onchange=changeNum(this.value)>";
for($j=10;$j<=50;$j=$j+5){
if($page_num==$j)
$perPage.="<OPTION VALUE=$j selected>$j";
else
$perPage.="<OPTION VALUE=$j>$j";
}
$perPage.="</select>";
// Combine: 组合输出
$navigator=$All." ".$First." | ".$Previous." | ".$Next." | ".$Last.$Current.$Goto.$perPage;
}
?>
调用: 记得写好二个js 函数: changeNum 与 goToPage()
包含文件:
include("pagenation.php");
$SQL="SELECT * FROM players";
// Pagenation:
if(!$num) $num=15;
pagenation($num,1,$_SERVER['PHP_SELF'],$SQL);
//Display data: global $rows,$result,$navigator are defined in pagenation.php
for($i=0,$i<$rows;$i++){
@mysql_data_seek($result,$i);
$data=@mysql_fetch_array($result);
............[表格输出数据]
// 然后打印导航的菜单
print("<span class="pgright">$navigator</span></div>");
搞定