<?php
class pagination{
private $pstyle;
public $cfg=array(
text=>array('首页','上一页','下一页','尾页'),
pagesize=>20,
//htmltpl=> "list{\$page}.shtml",
listtpl=>'[{$page}]',//仿搜索引擎页模板
tpl=>array(t,'条/',tp,'页',l,s) //默认调用方式
// total=>0 记录总数
);
public $totalpage; //总页数
/**
* 初始化函数
*
* @param array $cfg 配置
*/
function __construct(array $cfg=null){
$this->cfg=array_merge($this->cfg,$cfg);
if($this->cfg[page]){ //传入当前页 适合html,ajax 需同时传入cfg[htmltpl]才起作用
$this->arg[page]=$this->cfg[page];
}
else{
//分析URL中的当前页
parse_str($this->cfg[arg]?$this->cfg[arg]:$_SERVER['QUERY_STRING'],$this->arg);
if(!is_numeric($this->arg[page])){ //取得当前页号
$this->arg[page]=1;
}
else{
$this->arg[page]=abs(ceil($this->arg[page]));
}
}
//计算分页总数
$this->totalpage=ceil($this->cfg[total]/$this->cfg[pagesize]);
}
/**
* 创建翻页link
*
* @param unknown_type $page
* @return unknown
*/
private function buildurl($page){
if($this->cfg[ajax]){ //ajax翻页
return "javascript:{$this->cfg[ajax]}($page);";
}
elseif(!is_numeric($page)){ //javascript select控件翻页
$arg=$this->arg;
$arg[page]='';
return '?'.http_build_query($arg)."'+$page";
}
elseif(is_numeric($this->arg[page])&&$this->cfg[htmltpl]){ //静态翻页
return str_replace('{$page}',$page==1?null:$page,$this->cfg[htmltpl]);
}
else{ //PHP翻页
$arg=$this->arg;
$arg[page]=$page;
return '?'.http_build_query($arg);
}
}
/**
* 下拉列表
*
* @return unknown
*/
private function s(){
$str="<select size='1' onchange=\"".(($this->cfg[ajax])?$this->buildurl(this.value):"location.href='{$this->buildurl('this.value')}")."\">";
for($i=1;$i<=$this->totalpage;$i++){
$str.="<option value='$i'".(($this->arg[page]==$i)?' selected':null).">第{$i}页</option>";
}
$str.="</select>";
$this->pstyle[]=$str;
}
/**
* 首页样式
*
* @return unknown
*/
private function f($show=true){
$this->pstyle[]=$this->arg[page]==1&&$show? $this->cfg[text][0]:"<a href=\"{$this->buildurl(1)}\">{$this->cfg[text][0]}</a>";
}
/**
* 尾页样式
*
* @return unknown
*/
private function e($show=true){
$this->pstyle[]=$this->arg[page]==$this->totalpage&&$show? $this->cfg[text][3]:"<a href=\"{$this->buildurl($this->totalpage)}\">{$this->cfg[text][3]}</a>";
}
/**
* 上一页样式
*
* @return unknown
*/
private function p($show=true){
$this->pstyle[]=$this->arg[page]<2&&$show? $this->cfg[text][1]:"<a href=\"{$this->buildurl($this->arg[page]-1)}\">{$this->cfg[text][1]}</a>";
}
/**
* 下一页样式
*
* @return unknown
*/
private function n($show=true){
$this->pstyle[]=$this->arg[page]>=$this->totalpage&&$show? $this->cfg[text][2]:"<a href=\"{$this->buildurl($this->arg[page]+1)}\">{$this->cfg[text][2]}</a>";
}
/**
* 仿搜索引擎分页
*
* @return unknown
*/
private function l($limit=7,$lstyle=1){
$a=floor($limit/2); //左右偏移量
$l=$this->arg[page]-$a;$r=$this->arg[page]+$a; //默认偏移量
if($l<$a-1){//如果左不足
$r+=1-$l;
}
if($r>$this->totalpage){//如果右不足
$l-=$r-$this->totalpage;
$r=$this->totalpage;
}
if($l<1)$l=1;
//输出
switch ($lstyle){
case '0':
for($i=$l;$i<=$r;$i++){
$output.=' '.(($this->arg[page]==$i)? str_replace('{$page}',$i,$this->cfg[listtpl]):"<a href=\"{$this->buildurl($i)}\">".str_replace('{$page}',$i,$this->cfg[listtpl])."</a>").' ';
}
break;
case '1':
if($l>1)$output="<a href=\"{$this->buildurl(1)}\">".str_replace('{$page}',1,$this->cfg[listtpl])."</a>...";
for($i=$l;$i<=$r;$i++){
$output.=' '.(($this->arg[page]==$i)? str_replace('{$page}',$i,$this->cfg[listtpl]):"<a href=\"{$this->buildurl($i)}\">".str_replace('{$page}',$i,$this->cfg[listtpl])."</a>").' ';
}
if($r<=$this->totalpage-1)$output.='...'."<a href=\"{$this->buildurl($this->totalpage)}\">".str_replace('{$page}',$this->totalpage,$this->cfg[listtpl])."</a>";
}
$this->pstyle[]=$output;
}
/**
* 取得记录总数
*
*/
private function t(){
$this->pstyle[]=$this->cfg[total];
}
/**
* 取得总页数
*
*/
private function tp(){
$this->pstyle[]=$this->totalpage;
}
/**
* 创建分页样式
*
* @return unknown
*/
public function create(){
foreach($this->cfg[tpl] as $arg){
if(is_array($arg)){
if(method_exists($this,$func=array_shift($arg))){
call_user_func_array(array($this,$func),$arg);
}
else{
$this->pstyle[]=$func;
}
}
else{
if(method_exists($this,$arg)){
eval("\$this->{$arg}();");
}
else{
$this->pstyle[]=$arg;
}
}
}
return implode(' ',$this->pstyle);
}
}
?>
调用方法:
例1:默认调用
$pageination=new pagination(array(total=>200)); //必选参数total
echo $pageination->create();
例2:设置更多参数
$pageination=new pagination(array(total=>200,pagesize=>30,text=>array(|<,<,>,>|),tpl=>array(t,'条/',tp,'页',l,s))); //必选参数total,tpl内数组对应类中的函数名,如果函数不存在则按顺序原样显示出来
echo $pageination->create();
例3:复杂调用
$pageination=new pagination(array(total=>200,pagesize=>30,text=>array(|<,<,>,>|),tpl=>array(t,'条/',tp,'页',array(l,9,0),s)));
echo $pageination->create();
例4:ajax 调用
$pageination=new pagination(array(total=>200,ajax=>'loadlist')); //将在页的链接上使用javascript loadlist函数 带有一个参数是页数 即调用如 loadlist(5).
echo $pageination->create();
例5:静态页调用
$pageination=new pagination(array(total=>200,page=>1,htmltpl=>'list{$page}.shtml')); //将生成模板格式静态分页 $pageination->arg[page]=n 来改变当前页
echo $pageination->create();
php分页控件,含ajax知识
3星 · 超过75%的资源 需积分: 0 168 浏览量
更新于2008-10-30
1
收藏 2KB RAR 举报
在PHP开发中,分页控件是一个非常重要的功能,它能有效地管理大量数据,提高网页加载速度,并提供用户友好的浏览体验。结合Ajax技术,我们可以实现动态无刷新的分页,提升用户体验。本文将深入探讨PHP分页控件与Ajax的相关知识。
一、PHP分页控件基础
1. 分页需求:当数据库中的数据量过大,一次性加载全部数据会导致页面响应慢,用户体验下降。因此,我们需要分页显示数据,每次只加载一部分,用户可以通过翻页查看更多的信息。
2. 分页原理:PHP通过计算总页数,根据当前页码获取对应的数据段,然后在前端展示出来。主要涉及SQL查询语句(如LIMIT关键字)的使用,以及页码的处理逻辑。
3. 分页实现:通常,我们会创建一个包含上一页、下一页、跳转到指定页等元素的分页界面。用户点击这些元素时,后端根据请求的参数返回对应页的数据。
二、Ajax技术
1. Ajax全称Asynchronous JavaScript and XML,是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过XMLHttpRequest对象实现后台与服务器端的异步数据交换,使得用户可以不中断当前操作,即可获取并处理新数据。
2. Ajax的优点:提高网页交互性,减少网络通信,优化用户体验。
三、PHP分页与Ajax结合
1. 实现方式:在用户点击分页按钮时,触发Ajax事件,向服务器发送请求,请求携带当前页码等信息。服务器接收到请求后,根据参数计算出对应的数据,然后以JSON或其他格式返回。前端JavaScript接收数据并动态更新页面,实现无刷新分页。
2. 示例代码:创建一个Ajax函数,发送GET或POST请求,PHP接收请求并返回数据,前端解析数据并插入到DOM中。例如,使用jQuery库:
```javascript
$.ajax({
url: 'get_data.php', // PHP处理页面
type: 'GET',
data: {page: currentPage}, // 传递当前页码
success: function(data) {
// 更新HTML内容
$('#dataContainer').html(data);
}
});
```
```php
// get_data.php
$page = $_GET['page'];
// 根据$page获取数据库中的数据
$data = fetch_data($page);
echo json_encode($data); // 返回数据
```
四、优化与注意事项
1. 安全性:在处理用户输入的页码时,应进行验证和过滤,防止SQL注入等安全问题。
2. 性能:合理设置每页数据量,避免一次请求过多数据。同时,可以考虑使用缓存技术提高效率。
3. 用户体验:添加loading动画,提高用户感知;处理错误情况,提供友好的反馈信息。
PHP分页控件结合Ajax技术,能够为用户提供更加流畅、高效的浏览体验。通过合理的前端设计和后端处理,我们可以实现高效、安全的分页功能。在实际项目中,可以根据具体需求进行相应的定制和优化。
skylaugh
- 粉丝: 1
- 资源: 3
最新资源
- 机械手机器人含设计文档机械手-机械手完整图纸及毕业设计论文
- 百度地图+API+html
- Java毕设项目:基于spring+mybatis+maven+mysql实现的在线教学网络教学平台分前后台【含源码+数据库+毕业论文】
- 引用ubuntu操作系统装入移动硬盘ubuntu PDF
- 机械手机器人含设计文档机械手-机械手腕部设计
- 耳机线焊锡机sw18可编辑全套技术资料100%好用.zip
- Java毕设项目:基于spring+mybatis+maven+mysql实现的民宿旅游管理系统分前后台【含源码+数据库+毕业论文】
- MATLAB 实现基于卡尔曼滤波(Kalman Filter)进行时间序列预测模型的项目详细实例(含完整的程序,GUI设计和代码详解)
- 机械手机器人含设计文档机械手-机械手小车的设计
- MATLAB 实现基于K-means聚类进行时间序列预测模型的项目详细实例(含完整的程序,GUI设计和代码详解)
- MATLAB 实现基于Proximal Policy Optimization (PPO)进行时间序列预测模型的项目详细实例(含完整的程序,GUI设计和代码详解)
- 机械手机器人含设计文档机械手-基于PLC的机械手控制设计
- MATLAB 实现基于策略梯度方法(Policy Gradient Methods)进行时间序列预测模型的项目详细实例(含完整的程序,GUI设计和代码详解)
- MATLAB 实现基于深度Q网络(DQN)进行时间序列预测模型的项目详细实例(含完整的程序,GUI设计和代码详解)
- Java毕设项目:基于spring+mybatis+maven+mysql实现的图书商城管理系统分前后台【含源码+数据库+毕业论文】
- 机械手机器人含设计文档机械手-集装箱波纹板焊接机器人机构运动学分析及车体结构