前段时间写的个PHP分页类,适合所有URL形式

今天没有什么好写的,发个前段时间写的个用于CLBLOG的一个分页类,写的不是很复杂!但是通用性还不错,而且兼容现在流行的各种URL形式.可以自定义分页的变量、每页显示记录数量、显示页数、自定义URL形式。可以强制指定当前页.. 在显示输出上,具有显示重页数、当前页数、页数过多以“...”代替显示并且在页数过多的时候显示第一页和最后一页的链接、具有上一页下一页的功能等等... 截图:nav NOTICE:
┃-默认使用的是"page"来代表页的变量  ($flag)
┃-默认没有开启自定义URL地址类型  ($delimiter)
┃-默认在页面上显示10个页数  ($showListNum)
┃-默认没有开启强制指定当前页的功能
介绍几个简单使用方式,更多的使用方式自己稍微看下构造函数或者config函数就会一目了然了。 一:最简单的方式,这样适用于URL为简单的QueryString类型的URL,比如:http://intgu.com/?user=cluries&page=4&oh=china
1
2
3
4
5
6
<?php
include 'Pagination.php';
$pagi = new  Pagination(500,20);   //总共有500个记录,每页显示20个记录
//$pagi->config(500,50);
$pagi->pagi();
?>
二:自定义代表页数的变量,适合使用URL为类似的:http://intgu.com/html/category/php/page/2
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
include 'Pagination.php';
$pagi = new  Pagination();
 
//总共有500个记录,每页显示20个记录,以page代表分页变量
//显示10个页数,不强制设定当前页,URL中参数的分隔符为'/'
$pagi->config(500,50,'page',10,FALSE,'/'); 
 
//$html = $pagi->getPagi();   //getPagi()方法用于使用了类似与CTE的模板引擎的时候使用
//echo html;
 
$pagi->pagi();
?>
更多的使用方法查看代码构造函数或者config函数 完整代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
<?php
/*
 * 一个通用的分页类,基本上使用任何URL形式
 * 
 * @author : Cluries <vcommail#gmail.com>
 * @link   : http://intgu.com
 * @version 0.0.1  2009-02-05 (Require PHP version 5.0 or later)
 * 
 * Usage Example Ⅰ :
 * include 'Pagination.php';
 * $pagi = new  Pagination();
 * $pagi->config(500,20);
 * $pagi->pagi();
 * 
 * Usage Example Ⅱ :
 * include 'Pagination.php';
 * $pagi = new  Pagination();
 * $pagi->config(500,20,'pageNumber',false,10,'/');
 * $pagi->pagi();
 * 
 * 
 */
 
class Pagination {
 
	private $config;
 
	function __construct($recordCount = '', $perNumber = '', $flag = 'page',  $showListNum = 10,$nowPage = false, $delimiter = false) {
 
		$this->config = array ();
 
		if ($recordCount != '' && $perNumber != '') {
 
			$this->config ( $recordCount, $perNumber, $flag, $showListNum, $nowPage, $delimiter );
			;
		}
	}
 
	public function config($recordCount, $perNumber, $flag = 'page', $showListNum = 10, $nowPage = false, $delimiter = false) {
 
		if ($recordCount < 0 || $perNumber < 0) {
 
			$this->error ( '参数设置错误,总的记录数和每页数量不能小于0' );
		}
 
		if ($flag == '') {
 
			$this->error ( '参数设置错误,页码标志不能为空' );
		}
 
		if ($showListNum < 1) {
 
			$this->error ( '显示数量不能小于1' );
		}
 
		$this->config ['recordCount'] = intval ( $recordCount );
		$this->config ['perNumber'] = intval ( $perNumber );
		$this->config ['flag'] = trim ( $flag );
		$this->config ['nowPage'] = $nowPage;
		$this->config ['showListNum'] = $showListNum;
		$this->config ['delimiter'] = $delimiter;
 
		return;
	}
 
	public function pagi() {
 
		echo $this->process ();
	}
 
	public function getPagi() {
 
		return $this->process ();
	}
 
	private function process() {
 
		foreach ( $this->config as $v ) {
 
			if ($v === '') {
 
				$this->error ( '请先运行:config()' );
			}
		}
 
		if (! $this->config ['nowPage']) {
 
			if (isset ( $_GET [$this->config ['flag']] )) {
 
				$this->config ['nowPage'] = intval ( $_GET [$this->config ['flag']] );
			} else {
 
				$this->config ['nowPage'] = intval ( $_REQUEST [$this->config ['flag']] );
			}
		}
 
		$pageNum = ceil ( $this->config ['recordCount'] / $this->config ['perNumber'] );
		if ($this->config ['nowPage'] <= 0) {
 
			$this->config ['nowPage'] = 1;
		}
 
		if ($this->config ['nowPage'] > $pageNum) {
 
			$this->config ['nowPage'] = $pageNum;
		}
 
		$start = $this->config ['nowPage'] - floor ( $this->config ['showListNum'] / 2 );
		$start = ($start <= 0) ? 1 : $start;
 
		$end = $start + $this->config ['showListNum'];
		$end = ($end >= $pageNum) ? $pageNum : $end;
 
		if ($pageNum <= $this->config ['showListNum']) {
 
			$start = 1;
			$end = $pageNum;
		}
 
		$html = '<pagi> Page ' . $this->config ['nowPage'] . ' of ' . $pageNum . '</pagi>';
 
		if ($this->config ['nowPage'] > 1) {
 
			$html .= '<a name="nav" href="' . $this->pageNumberReplace ( $this->config ['nowPage'] - 1 ) . '" title="上一页">«</a>';
		} else {
 
			$html .= '<a name="nav">«</a>';
		}
 
		if ($start > 1) {
			$dot = $start - floor ( $this->config ['showListNum'] / 2 );
			$dot = $dot < 1 ? 1 : $dot;
			$html .= '<a href="' . $this->pageNumberReplace ( 1 ) . '">1</a> <a href="' . $this->pageNumberReplace ( $dot ) . '"> ... </a>';
		}
 
		for($i = $start; $i <= $end; $i ++) {
			if ($i == $this->config ['nowPage']) {
				$html .= '<a name="nowPage">' . $i . '</a>';
			} else {
 
				$html .= '<a href="' . $this->pageNumberReplace ( $i ) . '">' . $i . '</a>';
			}
		}
 
		if ($end < $pageNum) {
			$dot = $end + floor ( $this->config ['showListNum'] / 2 );
			$dot = $dot > $pageNum ? $pageNum : $dot;
			$html .= '<a href="' . $this->pageNumberReplace ( $dot ) . '"> ... </a><a href="' . $this->pageNumberReplace ( $pageNum ) . '">' . $pageNum . '</a>';
		}
 
		if ($this->config ['nowPage'] < $pageNum) {
 
			$html .= '<a name="nav" href="' . $this->pageNumberReplace ( $this->config ['nowPage'] + 1 ) . '" title="下一页">»</a>';
		} else {
 
			$html .= '<a name="nav">»</a>';
		}
 
		return $html;
 
	}
 
	private function pageNumberReplace($number) {
 
 
		if (! $this->config ['delimiter']) {
 
			return $this->pageNumberReplaceDefault ( $number );
		}
 
		return $this->pageNumberReplaceDelimiter ( $number );
	}
 
	private function pageNumberReplaceDefault($number) {
 
		$url = $_SERVER ['REQUEST_URI'];
		$pattern = '/([\?&]' . $this->parseRegStr ( $this->config ['flag'] ) . '=)\w+/i';
 
		if (preg_match ( $pattern, $url )) {
 
			$url = preg_replace ( $pattern, "\${1}" . $number, $url );
			return $url;
		} else if (preg_match ( '/(\.php)?\?/i', $url )) {
 
			return $url . '&' . $this->config ['flag'] . '=' . $number;
		} else {
 
			return $url . '?' . $this->config ['flag'] . '=' . $number;
		}
	}
 
	private function pageNumberReplaceDelimiter($number) {
 
		$url = $_SERVER ['REQUEST_URI'];
		$delimiter = $this->parseRegStr ( $this->config ['delimiter'] );
		$pattern = '/(' . $delimiter . $this->parseRegStr ( $this->config ['flag'] ) . $delimiter . ')\w+/i';
 
		if (preg_match ( $pattern, $url )) {
 
			return preg_replace ( $pattern, "\${1}" . $number, $url );
			;
		} else {
			$pattern = '/' . $delimiter . '$/i';
 
			if (preg_match ( $pattern, $url )) {
				return $url . $this->config ['flag'] . $this->config ['delimiter'] . $number;
			}
 
			return $url . $this->config ['delimiter'] . $this->config ['flag'] . $this->config ['delimiter'] . $number;
		}
 
	}
 
	private function parseRegStr($str) {
 
		$als = array ('/', '(', '[', '{', ',', '$', '^', '|', '?', '+', '*', '.', '}', ']', ')' );
 
		$new_als = array ('\/', '\(', '\[', '\{', '\,', '\$', '\^', '\|', '\?', '\+', '\*', '\.', '\}', '\]', '\)' );
 
		return str_replace ( $als, $new_als, $str );
	}
 
	private function error($e) {
 
		$e = '<strong>Error:</strong>' . $e;
		echo $e;
		exit ();
	}
 
	function __destruct() {
 
	}
}
 
?>

“前段时间写的个PHP分页类,适合所有URL形式”   10 comments

写的不错,比我的写的要好些 8)
avatar
呵呵,这个当初有几个地方都要用到,所以才写的!有的地方也不严谨..比如在匹配URL的时候,页数是匹配的\w+ 并没有严格的匹配\d+,主要还是嫌麻烦!懒得再次去处理有人恶意修改URL参数为非数字时候的问题...........
avatar
收藏了。嘿嘿。正开始学PHP。看得头大。
avatar
呵呵,越来越多的人开始用PHP了,很好很强大!
avatar
正找这个 收下了`~~~
avatar
从来没写过类,看来得好好学习下类了,一个分页看得头昏了。 :lol:
avatar
慢慢的接触多了,写的多了就好了~~ :((
avatar
写的不怎么样
avatar
内个... 当搜索的时候, 用post方式提交的.. 然后对结果分页, 当点击第二页的时候, post值丢失的问题. 怎么处理比较好点呢?
avatar

Leave a comment:

XHTML: You can use these tags: <a href="" title=""> <b> <blockquote cite=""> <em> <i> <strong> <p> <br><br />