当前位置:Gxlcms > PHP教程 > php+ajax实现的分页类示例代码

php+ajax实现的分页类示例代码

时间:2021-07-01 10:21:17 帮助过:4人阅读

分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解。

一、分页原理:
所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:

每页多少条记录($PageSize)?
当前是第几页($CurrentPageID)?

现在只要再给我一个结果集,我就可以显示某段特定的结果出来。

至于其他的参数,比如:上一页($PReviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到。

以MySQL数据库为例,如果要从表内截取某段内容,sql语句可以用:select * from table limit offset, rows。看看下面一组sql语句,尝试一下发现其中的规率。

前10条记录:select * from table limit 0,10
第11至20条记录:select * from table limit 10,10
第21至30条记录:select * from table limit 20,10
……
这一组sql语句其实就是当$PageSize=10的时候取表内每一页数据的sql语句,我们可以总结出这样一个模板:
select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize
拿这个模板代入对应的值和上边那一组sql语句对照一下看看是不是那么回事。搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。

本篇文章主要介绍php+ajax实现的分页类,实现的最终效果如下图

代码如下

  1. <?php
  2. //本分页类不处理SQL;
  3. //大大的加快了分页功能
  4. //http://blog.csdn.net/fkedwgwy
  5. //潇湘博客--潇湘
  6. /**
  7. 演示
  8. require_once('../libs/classes/page.class.php');
  9. $page=new page(array('total'=>1000,'perpage'=>20));
  10. echo 'mode:1<br>'.$page->show();
  11. echo '<hr>mode:2<br>'.$page->show(2);
  12. echo '<hr>mode:3<br>'.$page->show(3);
  13. echo '<hr>mode:4<br>'.$page->show(4);
  14. echo '<hr>开始AJAX模式:';
  15. $ajaxpage=new page(array('total'=>1000,'perpage'=>20,'ajax'=>'ajax_page','page_name'=>'test'));
  16. echo 'mode:1<br>'.$ajaxpage->show();
  17. */
  18. class Zend_Page
  19. {
  20. /**
  21. * config ,public
  22. */
  23. var $page_name="page";//page标签,用来控制url页。比如说xxx.php?PB_page=2中的PB_page
  24. var $next_page='>';//下一页
  25. var $pre_page='<';//上一页
  26. var $first_page='First';//首页
  27. var $last_page='Last';//尾页
  28. var $pre_bar='<<';//上一分页条
  29. var $next_bar='>>';//下一分页条
  30. var $format_left='';
  31. var $format_right='';
  32. var $is_ajax=false;//是否支持AJAX分页模式
  33. var $next_ten_page=">>>";
  34. var $per_ten_page="<<<";
  35. /**
  36. * private
  37. *
  38. */
  39. var $pagebarnum=10;//控制记录条的个数。
  40. var $totalpage=0;//总页数
  41. var $ajax_action_name='';//AJAX动作名
  42. var $nowindex=1;//当前页
  43. var $url="";//url地址头
  44. var $offset=0;
  45. var $total='';
  46. /**
  47. * constructor构造函数
  48. *
  49. * @param array $array['total'],$array['perpage'],$array['nowindex'],$array['url'],$array['ajax']...
  50. */
  51. function Zend_Page($array)
  52. {
  53. if(is_array($array)){
  54. if(!array_key_exists('total',$array))$this->error(FUNCTION,'need a param of total');
  55. $total=intval($array['total']);
  56. $perpage=(array_key_exists('perpage',$array))?intval($array['perpage']):10;
  57. $nowindex=(array_key_exists('nowindex',$array))?intval($array['nowindex']):'';
  58. $url=(array_key_exists('url',$array))?$array['url']:'';
  59. }else{
  60. $total=$array;
  61. $perpage=10;
  62. $nowindex='';
  63. $url='';
  64. }
  65. if((!is_int($total))||($total<0))$this->error(FUNCTION,$total.' is not a positive integer!');
  66. if((!is_int($perpage))||($perpage<=0))$this->error(FUNCTION,$perpage.' is not a positive integer!');
  67. if(!empty($array['page_name']))$this->set('page_name',$array['page_name']);//设置pagename
  68. $this->_set_nowindex($nowindex);//设置当前页
  69. $this->_set_url($url);//设置链接地址
  70. $this->totalpage=ceil($total/$perpage);
  71. $this->total=$total;
  72. $this->offset=($this->nowindex-1)*$perpage;
  73. if(!empty($array['ajax']))$this->open_ajax($array['ajax']);//打开AJAX模式
  74. }
  75. /**
  76. * 设定类中指定变量名的值,如果改变量不属于这个类,将throw一个exception
  77. *
  78. * @param string $var
  79. * @param string $value
  80. */
  81. function set($var,$value)
  82. {
  83. if(in_array($var,get_object_vars($this)))
  84. $this->$var=$value;
  85. else {
  86. $this->error(FUNCTION,$var." does not belong to PB_Page!");
  87. }
  88. }
  89. /**
  90. * 打开倒AJAX模式
  91. *
  92. * @param string $action 默认ajax触发的动作。
  93. */
  94. function open_ajax($action)
  95. {
  96. $this->is_ajax=true;
  97. $this->ajax_action_name=$action;
  98. }
  99. /**
  100. * 获取显示"下一页"的代码
  101. *
  102. * @param string $style
  103. * @return string
  104. */
  105. function next_page($style='')
  106. {
  107. if($this->nowindex<$this->totalpage){
  108. return $this->_get_link($this->_get_url($this->nowindex+1),$this->next_page,$style);
  109. }
  110. return '<span class="'.$style.'">'.$this->next_page.'</span>';
  111. }
  112. /**
  113. * 获取显示“上一页”的代码
  114. *
  115. * @param string $style
  116. * @return string
  117. */
  118. function pre_page($style='')
  119. {
  120. if($this->nowindex>1){
  121. return $this->_get_link($this->_get_url($this->nowindex-1),$this->pre_page,$style);
  122. }
  123. return '<span class="'.$style.'">'.$this->pre_page.'</span>';
  124. }
  125. /**
  126. * 获取显示“上十页”的代码
  127. *
  128. * @param string $style
  129. * @return string
  130. */
  131. function pre_ten_page($style='')
  132. {
  133. if(intval($this->nowindex/10)+1>1){
  134. return $this->_get_link($this->_get_url(intval($this->nowindex/10)*10-5),$this->pre_ten_page,$style);
  135. }
  136. return '<span class="'.$style.'">'.$this->pre_ten_page.'</span>';
  137. }
  138. /**
  139. * 获取显示"下十页"的代码
  140. *
  141. * @param string $style
  142. * @return string
  143. */
  144. function next_ten_page($style='')
  145. {
  146. if(intval($this->nowindex/10) <intval($this->totalpage/10)){
  147. return $this->_get_link($this->_get_url((intval($this->nowindex/10)+1)*10+5),$this->next_ten_page,$style);
  148. }
  149. return '<span class="'.$style.'">'.$this->next_ten_page.'</span>';
  150. }
  151. /**
  152. * 获取显示“首页”的代码
  153. *
  154. * @return string
  155. */
  156. function first_page($style='')
  157. {
  158. if($this->nowindex==1){
  159. return '<span class="'.$style.'">'.$this->first_page.'</span>';
  160. }
  161. return $this->_get_link($this->_get_url(1),$this->first_page,$style);
  162. }
  163. /**
  164. * 获取显示“尾页”的代码
  165. *
  166. * @return string
  167. */
  168. function last_page($style='')
  169. {
  170. if($this->nowindex==$this->totalpage){
  171. return '<span class="'.$style.'">'.$this->last_page.'</span>';
  172. }
  173. return $this->_get_link($this->_get_url($this->totalpage),$this->last_page,$style);
  174. }
  175. function nowbar($style='',$nowindex_style='')
  176. {
  177. $plus=ceil($this->pagebarnum/2);
  178. if($this->pagebarnum-$plus+$this->nowindex>$this->totalpage)$plus=($this->pagebarnum-$this->totalpage+$this->nowindex);
  179. $begin=$this->nowindex-$plus+1;
  180. $begin=($begin>=1)?$begin:1;
  181. $return='';
  182. for($i=$begin;$i<$begin+$this->pagebarnum;$i++)
  183. {
  184. if($i<=$this->totalpage){
  185. if($i!=$this->nowindex)
  186. $return.=$this->_get_text($this->_get_link($this->_get_url($i),$i,$style));
  187. else
  188. $return.=$this->_get_text('<span class="'.$nowindex_style.'">'.$i.'</span>');
  189. }else{
  190. break;
  191. }
  192. $return.="\n";
  193. }
  194. unset($begin);
  195. return $return;
  196. }
  197. /**
  198. * 获取显示跳转按钮的代码
  199. *
  200. * @return string
  201. */
  202. function select()
  203. {
  204. $return='<select name="PB_Page_Select" onchange="location.replace(this.value)" >';
  205. for($i=1;$i<=$this->totalpage;$i++)
  206. {
  207. if($i==$this->nowindex){
  208. $return.='<option value='.$this->_get_url($i).' selected>'.$i.'</option>';
  209. }else{
  210. $return.='<option value='.$this->_get_url($i).'>'.$i.'</option>';
  211. }
  212. }
  213. unset($i);
  214. $return.='</select>';
  215. return $return;
  216. }
  217. /**
  218. * 获取mysql 语句中limit需要的值
  219. *
  220. * @return string
  221. */
  222. function offset()
  223. {
  224. return $this->offset;
  225. }
  226. /**
  227. * 控制分页显示风格(你可以增加相应的风格)
  228. *
  229. * @param int $mode
  230. * @return string
  231. */
  232. function show($mode=1,$url='')
  233. {
  234. switch ($mode)
  235. {
  236. case '1':
  237. $this->next_page='下一页';
  238. $this->pre_page='上一页';
  239. return $this->pre_page().$this->nowbar().$this->next_page().'第'.$this->select().'页';
  240. break;
  241. case '2':
  242. $this->next_page='下一页';
  243. $this->pre_page='上一页';
  244. $this->first_page='首页';
  245. $this->last_page='尾页';
  246. return $this->first_page().$this->pre_page().'[第'.$this->nowindex.'页]'.$this->next_page().$this->last_page().'第'.$this->select().'页';
  247. break;
  248. case '3':
  249. $this->next_page='下一页';
  250. $this->pre_page='上一页';
  251. $this->first_page='首页';
  252. $this->last_page='尾页';
  253. return $this->first_page().$this->pre_page().$this->next_page().$this->last_page();
  254. break;
  255. case '4':
  256. $this->next_page='next';
  257. $this->pre_page='last';
  258. return $this->pre_page().$this->nowbar().$this->next_page();
  259. break;
  260. case '5':
  261. return $this->pre_bar().$this->pre_page().$this->nowbar().$this->next_page().$this->next_bar();
  262. break;
  263. case '6':
  264. //启用了“上一页”,“下一页”,“最后一页”。可根据情况启用“第一页”。
  265. //$this->first_page='<img src="'.HOSTPATH.'images/propageup.jpg" width="64" height="13" >';
  266. $this->pre_page='<img src="'.HOSTPATH.'images/propageup.jpg" style="width:58px; height:18px;">';
  267. $this->next_page='<img src="'.HOSTPATH.'images/propagedown.jpg" style="width:58px; height:18px;">';
  268. $this->last_page='最后一页';
  269. //return "<td width=39 align='center'>".$this->select()."</td>"."<td><span style='color:#666666'>页</span></td>"."<td width=72 align=right>".$this->first_page()."</td>"."<td width=72 align=right>".$this->pre_page()."</td>"."<td width=72 align=right>".$this->next_page()."</td>"."<td width=72 align=right>".$this->last_page()."</td>";
  270. return "<td align='right'>共有[".$this->total."]件商品 ".$this->nowindex."/".$this->totalpage."页</td>"."<td width=145>".$this->pre_page()." ".$this->next_page()."</td>"."<td width=145>".$this->last_page()." ".$this->select()." 页 ";
  271. break;
  272. case '7':
  273. $this->next_page='<img src="'.HOSTPATH.'images/arrpagedown.jpg"/>';
  274. $this->pre_page='<img src="'.HOSTPATH.'images/arrpageup.jpg"/>';
  275. $this->first_page='<img src="'.HOSTPATH.'images/arrhome.jpg"/>';
  276. $this->last_page='<img src="'.HOSTPATH.'images/arrend.jpg"/>';
  277. if($this->totalpage==0)
  278. {$this->nowindex=0;}
  279. return $this->first_page()." ".$this->pre_page()." ".$this->next_page()." ".$this->last_page()." ".$this->select();
  280. break;
  281. case '8':
  282. //启用了“上一页”,“下一页”,“最后一页”。可根据情况启用“第一页”。
  283. //$this->first_page='<img src="'.HOSTPATH.'images/propageup.jpg" width="64" height="13" >';
  284. $this->pre_page='<img src="'.HOSTPATH.'images/propageup.jpg" style="width:58px; height:18px;">';
  285. $this->next_page='<img src="'.HOSTPATH.'images/propagedown.jpg" style="width:58px; height:18px;">';
  286. $this->last_page='最后一页';
  287. if($this->totalpage==0)
  288. {$this->nowindex=0;}
  289. //return "<td width=39 align='center'>".$this->select()."</td>"."<td><span style='color:#666666'>页</span></td>"."<td width=72 align=right>".$this->first_page()."</td>"."<td width=72 align=right>".$this->pre_page()."</td>"."<td width=72 align=right>".$this->next_page()."</td>"."<td width=72 align=right>".$this->last_page()."</td>";
  290. return "<td align='right'>共有[".$this->total."]条信息 ".$this->nowindex."/".$this->totalpage."页</td>"."<td width=145>".$this->pre_page()." ".$this->next_page()."</td>"."<td width=145>".$this->last_page()." ".$this->select()." 页 ";
  291. break;
  292. }
  293. }
  294. /*----------------private function (私有方法)-----------------------------------------------------------*/
  295. /**
  296. * 设置url头地址
  297. * @param: String $url
  298. * @return boolean
  299. */
  300. function _set_url($url="")
  301. {
  302. if(!empty($url)){
  303. //手动设置
  304. $this->url=$url.((stristr($url,'?'))?'&':'?').$this->page_name."=";
  305. }else{
  306. //自动获取
  307. if(empty($_SERVER['QUERY_STRING'])){
  308. //不存在QUERY_STRING时
  309. $this->url=$_SERVER['REQUEST_URI']."?".$this->page_name."=";
  310. }else{
  311. //
  312. if(stristr($_SERVER['QUERY_STRING'],$this->page_name.'=')){
  313. //地址存在页面参数
  314. $this->url=str_replace($this->page_name.'='.$this->nowindex,'',$_SERVER['REQUEST_URI']);
  315. $last=$this->url[strlen($this->url)-1];
  316. if($last=='?'||$last=='&'){
  317. $this->url.=$this->page_name."=";
  318. }else{
  319. $this->url.='&'.$this->page_name."=";
  320. }
  321. }else{
  322. //
  323. $this->url=$_SERVER['REQUEST_URI'].'&'.$this->page_name.'=';
  324. }//end if
  325. }//end if
  326. }//end if
  327. }
  328. /**
  329. * 设置当前页面
  330. *
  331. */
  332. function _set_nowindex($nowindex)
  333. {
  334. if(empty($nowindex)){
  335. //系统获取
  336. if(isset($_GET[$this->page_name])){
  337. $this->nowindex=intval($_GET[$this->page_name]);
  338. }
  339. }else{
  340. //手动设置
  341. $this->nowindex=intval($nowindex);
  342. }
  343. }
  344. /**
  345. * 为指定的页面返回地址值
  346. *
  347. * @param int $pageno
  348. * @return string $url
  349. */
  350. function _get_url($pageno=1)
  351. {
  352. return $this->url.$pageno;
  353. }
  354. /**
  355. * 获取分页显示文字,比如说默认情况下_get_text('<a href="">1</a>')将返回[<a href="">1</a>]
  356. *
  357. * @param String $str
  358. * @return string $url
  359. */
  360. function _get_text($str)
  361. {
  362. return $this->format_left.$str.$this->format_right;
  363. }
  364. /**
  365. * 获取链接地址
  366. */
  367. function _get_link($url,$text,$style=''){
  368. $style=(empty($style))?'':'class="'.$style.'"';
  369. if($this->is_ajax){
  370. //如果是使用AJAX模式
  371. return '<a '.$style.' href="javascript:'.$this->ajax_action_name.'(\''.$url.'\')">'.$text.'</a>';
  372. }else{
  373. return '<a '.$style.' href="'.$url.'">'.$text.'</a>';
  374. }
  375. }
  376. /**
  377. * 出错处理方式
  378. */
  379. function error($function,$errormsg)
  380. {
  381. die('Error in file <b>'.FILE.'</b> ,Function <b>'.$function.'()</b> :'.$errormsg);
  382. }
  383. }
  384. ?>

以上就是php+ajax实现的分页类示例代码的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行