>백엔드 개발 >PHP 튜토리얼 >공유: PHP 페이지 넘기기(페이징) 클래스의 예제 코드

공유: PHP 페이지 넘기기(페이징) 클래스의 예제 코드

WBOY
WBOY원래의
2016-07-25 08:52:25993검색
  1. /**
  2. * filename: ext_page.class.php
  3. * @package:phpbean
  4. * descrīption:超強分頁類,四種分頁模式,預設為類似baidu,google的分頁風格。
  5. * 2.0增加功能:支援自訂風格,自訂樣式,同時支援PHP4和PHP5,
  6. * example:
  7. * 模式四種分頁模式:
  8. require_once('../libs/ classes/page.class.php');
  9. $page=new page(array('total'=>1000,'perpage'=>20));
  10. echo 'mode:1
    '. $page->show();
  11. echo '
    mode:2
    '.$page->show(2);
  12. echo '
    mode:3
    '.$ page->show(3);
  13. echo '
    mode:4
    '.$page->show(4);
  14. 開啟AJAX:
  15. $ajaxpage=new page(array( 'total'=>1000,'perpage'=>20,'ajax'=>'ajax_page','page_name'=>'test'));
  16. echo 'mode:1
    '.$ajaxpage- >show();
  17. 採用繼承自訂分頁顯示模式。
  18. 編輯整理:腳本學堂 http://bbs.it-home.org
  19. */
  20. class _page
  21. {
  22. /**
  23. * 配置,公用
  24. class _page
  25. {
  26. /**
  27. * 私人
  28. *
  29. /
  30. var $page_name="PB_page";//page標籤,用來控制url頁。例如說xxx.php?PB_page=2中的PB_page
  31. var $next_page='>';//下一頁
  32. var $pre_page=' var $first_page ='First';//首頁
  33. var $last_page='Last';//尾頁
  34. var $pre_bar=' var $next_bar='> >';//下一分頁條
  35. var $format_left='[';
  36. var $format_right=']';
  37. var $is_ajax=false;//是否支援AJAX分頁模式
  38. /**
  39. * 建構子建構子
  40. *
  41. * @param array $array['total'],$array['perpage'],$array['nowindex'],$array['url'] , $array['ajax']...
  42. */
  43. var $pagebarnum=10;//控制記錄條的數量。
  44. var $totalpage=0;//總頁數
  45. var $ajax_action_name='';//AJAX動作名稱
  46. var $nowindex=1;//目前頁
  47. var $url=" ";//url位址頭
  48. var $offset=0;
  49. /**
  50. * 設定類別中指定變數名稱的值,如果改變量不屬於這個類,將throw一個exception
  51. *
  52. * @param string $var
  53. * @param string $value
  54. */
  55. function page($array)
  56. {
  57. if(is_array( $array)){
  58. if(!array_key_exists('total',$array))$this->error(__FUNCTION__,'need a param of total');
  59. $total=intval($array[' total']);
  60. $perpage=(array_key_exists('perpage',$array))?intval($array['perpage']):10;
  61. $nowindex=(array_key_exists('nowindex',$ array))?intval($array['nowindex']):'';
  62. $url=(array_key_exists('url',$array))?$array['url']:'';
  63. }else{
  64. $total=$array;
  65. $perpage=10;
  66. $nowindex='';
  67. $url='';
  68. }
  69. if((!is_int ($total))||($totalerror(__FUNCTION__,$total.' is not a positive integer!');
  70. if((!is_int($perpage))|| ($perpageerror(__FUNCTION__,$perpage.' is not a positive integer!');
  71. if(!empty($array['page_name']))$this-> set('page_name',$array['page_name']);//設定pagename
  72. $this->_set_nowindex($nowindex);//設定目前頁面
  73. $this->_set_url($url); //設定連結位址
  74. $this->totalpage=ceil($total/$perpage);
  75. $this->offset=($this->nowindex-1)*$perpage;
  76. if( !empty($array['ajax']))$this->open_ajax($array['ajax']);//開啟AJAX模式
  77. }
  78. /***/
  79. function set($var,$value)
  80. {
  81. if(in_array($var,get_object_vars($this)))
  82. $this->$var=$value;
  83. else {
  84. $this->$var=$value;
  85. else {
  86. $this->error(__FUNCTION__,$var." does not belong to PB_Page!");
  87. }
  88. } /** * 開啟倒AJAX模式 * * @param string $action 預設ajax觸發的動作。
  89. */
  90. function open_ajax($action)
  91. {
  92. $this->is_ajax=true;
  93. $this->ajax_action_name=$action;
  94. }
  95. /**
  96. * "다음 페이지"를 표시하는 코드 가져오기
  97. *
  98. * @param string $style
  99. * @return string
  100. */
  101. function next_page($style='')
  102. {
  103. if($this->nowindex<$this->totalpage) {
  104. return $this->_get_link($this->_get_url($this->nowindex 1),$this->next_page,$style);
  105. }
  106. return ''.$this->next_page.'';
  107. }
  108. /**
  109. * "이전 페이지"를 표시하는 코드 가져오기
  110. *
  111. * @param string $style
  112. * @return string
  113. */
  114. 함수 pre_page($style='')
  115. {
  116. if($this->nowindex>1){
  117. return $this->_get_link($this->_get_url($this->nowindex-1),$this->pre_page,$style);
  118. }
  119. return ''.$this->pre_page.'';
  120. }
  121. /**
  122. * "홈 페이지"를 표시하는 코드 가져오기
  123. *
  124. * @return string
  125. */
  126. function first_page($style='')
  127. {
  128. if($this->nowindex==1){
  129. return ''.$this->first_page.'';
  130. }
  131. return $this->_get_link($this->_get_url(1),$this->first_page,$style);
  132. }
  133. /**
  134. * "마지막 페이지"를 표시하는 코드 가져오기
  135. *
  136. * @return string
  137. */
  138. function last_page($style='')
  139. {
  140. if($this->nowindex==$this- >totalpage){
  141. return ''.$this->last_page.'';
  142. }
  143. return $this->_get_link($this->_get_url($this->totalpage),$this->last_page,$style);
  144. }
  145. function nowbar($style='',$nowindex_style='')
  146. {
  147. $plus=ceil($this->pagebarnum/2);
  148. if($this->pagebarnum-$plus $this->nowindex>$this->totalpage)$plus=($this->pagebarnum-$this->totalpage $this-> 지금색인);
  149. $begin=$this->nowindex-$plus 1;
  150. $begin=($begin>=1)?$begin:1;
  151. $return='';
  152. for($i=$begin;$i<$begin $this->pagebarnum;$i )
  153. {
  154. if($i<=$this->totalpage){
  155. if($i!=$this->nowindex)
  156. $return.=$this->_get_text($this->_get_link($this->_get_url($i),$i,$style )));
  157. else
  158. $return.=$this->_get_text(''.$i.'');
  159. }else{
  160. break;
  161. }
  162. $return.="n";
  163. }
  164. unset($begin);
  165. 반환 $return;
  166. }
  167. /**
  168. * 점프 버튼을 표시하는 코드 가져오기
  169. *
  170. * @return string
  171. */
  172. function select()
  173. {
  174. $return='';
  175. 반환 $return;
  176. }
  177. /**
  178. * mysql 문에서 제한에 필요한 값을 가져옵니다.
  179. *
  180. * @return string
  181. */
  182. function offset()
  183. {
  184. return $this->offset;
  185. }
  186. /**
  187. * 페이징 표시 스타일 제어(해당 스타일 추가 가능)
  188. *
  189. * @param int $mode
  190. * @return string
  191. */
  192. function show($mode=1)
  193. {
  194. 스위치($mode)
  195. {
  196. case '1':
  197. $this->next_page='下一页';
  198. $this->pre_page='상일页';
  199. return $this->pre_page().$this->nowbar().$this->next_page().'第'.$this->select().'页';
  200. 휴식;
  201. 사례 '2':
  202. $this->next_page='下一页';
  203. $this->pre_page='상일页';
  204. $this->first_page='首页';
  205. $this->last_page='尾页';
  206. return $this->first_page().$this->pre_page().'[第'.$this->nowindex.'页]'.$this->next_page().$this ->last_page().'第'.$this->select().'页';
  207. 휴식;
  208. 사례 '3':
  209. $this->next_page='下一页';
  210. $this->pre_page='상일页';
  211. $this->first_page='首页';
  212. $this->last_page='尾页';
  213. return $this->first_page().$this->pre_page().$this->next_page().$this->last_page();
  214. 휴식;
  215. 사례 '4':
  216. $this->next_page='下一页';
  217. $this->pre_page='상일页';
  218. return $this->pre_page().$this->nowbar().$this->next_page();
  219. 휴식;
  220. 케이스 '5':
  221. return $this->pre_bar().$this->pre_page().$this->nowbar().$this->next_page().$this ->next_bar();
  222. 휴식;
  223. 케이스 '6':
  224. return $this->select();
  225. 휴식;
  226. 케이스 '7':
  227. return $this->nowbar();
  228. 휴식;
  229. }
  230. }
  231. /*---프라이빗 함수(私유방법)------------ ---------------------*/
  232. /**
  233. * URL 헤더 주소 설정
  234. * @param: String $url
  235. * @return boolean
  236. */
  237. function _set_url($url="")
  238. {
  239. if(!empty($url)){
  240. //手动设置
  241. $ this->url=$url.((stristr($url,'?'))?'&':'?').$this->page_name."=";
  242. }else{
  243. //自动获取
  244. if(empty($_SERVER['QUERY_STRING'])){
  245. //불存재QUERY_STRING时
  246. $this->url=$ _SERVER['REQUEST_URI']."?".$this->page_name."=";
  247. }else{
  248. //
  249. if(stristr($_SERVER['QUERY_STRING'],$this->page_name.'=')){
  250. //지대면参数
  251. $this->url=str_replace($this->page_name.'='.$this->nowindex,'',$_SERVER['REQUEST_URI']);
  252. $last=$this->url[strlen($this->url)-1];
  253. if($last=='?'||$last=='&'){
  254. $this->url.=$this->page_name."=";
  255. }else{
  256. $this->url.='&'.$this->page_name."=";
  257. }
  258. }else{
  259. //
  260. $this->url=$_SERVER['REQUEST_URI'].'&'.$this->page_name.'=';
  261. }//end if
  262. }//end if
  263. }//end if
  264. }
  265. /**
  266. * 현재 페이지 설정
  267. *
  268. */
  269. function _set_nowindex($nowindex )
  270. {
  271. if(empty($nowindex)){
  272. //系统获取
  273. if(isset($_GET[$this->page_name])){
  274. $this->nowindex=intval($_GET[$this->페이지_이름]);
  275. }
  276. if(isset($_POST['PB_Page_Select'])){
  277. $this->nowindex=$_POST['PB_Page_Select'];
  278. }
  279. }else{
  280. //수공축
  281. $this->nowindex=intval($nowindex);
  282. }
  283. }
  284. /**
  285. * 지정된 페이지의 주소 값을 반환합니다.
  286. *
  287. * @param int $pageno
  288. * @return string $url
  289. */
  290. function _get_url($pageno=1)
  291. {
  292. return $this->url.$pageno ;
  293. }
  294. /**
  295. * 페이지 매기기 표시 텍스트 가져오기. 예를 들어 기본적으로 _get_text('1')는 [1를 반환합니다. ]
  296. *
  297. * @param String $str
  298. * @return string $url
  299. */
  300. function _get_text($str)
  301. {
  302. return $this->format_left.$str.$this-> 형식_오른쪽;
  303. }
  304. /**
  305. * 링크 주소 받기
  306. */
  307. function _get_link($url,$text,$style=''){
  308. $style=(empty($style)) ?'':'class="'.$style.'"';
  309. if($this->is_ajax){
  310. //如果是使用AJAX模式
  311. return ''.$text.'';
  312. }else{
  313. return ''.$text.'';
  314. }
  315. }
  316. /**
  317. * 오류 처리
  318. */
  319. 함수 오류($function,$errormsg)
  320. {
  321. die('파일 '.__FILE__에 오류가 있습니다.' ,Function '.$function.'() :'.$errormsg)
  322. }
  323. }
  324. // 페이징 클래스 상속 및 데이터베이스 액세스 추가 Capability .
  325. class Page 확장 _Page {
  326. var $db; //db 연결 개체
  327. var $_Sql_Query = '' //데이터베이스의 SQL 쿼리
  328. var $_Total = 0; /쿼리 전체 레코드는
  329. var $_Rst = array(); //쿼리된 레코드입니다.
  330. /**
  331. * 페이징 쿼리 라이브러리
  332. *
  333. * @param String $Sql 레코드 쿼리용 SQL 문
  334. * @param int $pagenuber 페이지당 레코드 수
  335. * @param int $ pagen 현재 페이지
  336. * @param String $url 페이징 링크에서 가져온 매개변수 index.php?xx=b&bb=33
  337. * @param String $pname 현재 페이지의 표시, 기본값은 index입니다. .php?xx=b&bb=33&page=2 특별한 요구사항이 있는 경우
  338. $pname의 매개변수를 수정할 수 있습니다. 예: $pname='db_page', index.php?xx=b&bb=33&db_page= 2
  339. * @return Mysql_Page
  340. */
  341. 함수 페이지($db, $ sql_query = '', $max_rows_per_page = 20, $current_page_number = 0, $url = '', $parameters = '', $pname = 'PB_page',$otc = '*') {
  342. $this -> db = $db;
  343. $pos_to = strlen($sql_query);
  344. $pos_from = strpos($sql_query, 'from', 0)
  345. $pos_group_by = strpos($sql_query, '그룹별' , $ pos_from)
  346. if (($pos_group_by < $pos_to) && ($pos_group_by != false)) $pos_to = $pos_group_by
  347. $pos_having = strpos($sql_query, 'having', $pos_from );
  348. if (($pos_having < $pos_to) && ($pos_having != false)) $pos_to = $pos_having
  349. $pos_order_by = strpos($sql_query, 'order by', $pos_from);
  350. if (($pos_order_by < $pos_to) && ($pos_order_by != false)) $pos_to = $pos_order_by; ​​​​
  351. $reviews_count = $this -> ($otc) as total " . substr($sql_query, $pos_from, ($pos_to - $pos_from)));
  352. $query_num_rows = $reviews_count[0]['total'];
  353. $this -> ; _Total = $ query_num_rows;
  354. $num_pages = ceil($query_num_rows / $max_rows_per_page)
  355. if ($current_page_number > $num_pages) {
  356. $current_page_number = $num_pages; $offset = ( $max_rows_per_page * ($current_page_number - 1));
  357. if ($offset < 0) $offset = 0
  358. if ($offset > 0) {
  359. $offset = $ 오프셋 1; $this -> 데이터베이스
  360. parent :: page(array('total' => $query_num_rows, 'perpage' => $max_rows_per_page, 'page_name' => $pname, 'url' => $url, 'parameters) ' => $ 매개변수));
  361. }
  362. /**
  363. * 현재 페이지의 기록을 가져와서 배열을 반환합니다.
  364. */
  365. function findByAll() {
  366. return $this ->
  367. /* *
  368. * 페이징 정보 표시
  369. *
  370. * @param int $model
  371. */
  372. function dispaly_links($model) {
  373. $this -> show($model)
  374. }
  375. /**
  376. * 레코드 수를 반환합니다.
  377. *
  378. * @return Int
  379. */
  380. function getCount () {
  381. return $this ->
  382. }
  383. /**
  384. * 쿼리 결과 레코드 개수를 가져옵니다..
  385. *
  386. * @return Int
  387. */
  388. function getRows() {
  389. return count($this -> _Rst) ;
  390. }
  391. /**
  392. * 쿼리 기능 실행
  393. * 배열 계산
  394. * 프라이빗 메소드
  395. */
  396. function setData() {
  397. $this -> $this -> _Sql_Query)
  398. }
  399. }
  400. ?>
  401. 코드 복사
  402. >
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.