php分頁是很經(jīng)典的問題,百度一搜一大把的案例代碼!首先確認(rèn)總數(shù),然后確認(rèn)每頁多少條數(shù)據(jù),然后分了多少頁,最后形成分頁!加油
創(chuàng)新互聯(lián)公司"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機(jī)版的企業(yè)網(wǎng)站。實(shí)現(xiàn)跨屏營銷,產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動(dòng)網(wǎng)絡(luò)一網(wǎng)打盡,滿足企業(yè)的營銷需求!創(chuàng)新互聯(lián)公司具備承接各種類型的成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)項(xiàng)目的能力。經(jīng)過10多年的努力的開拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務(wù),并獲得了客戶的一致好評(píng)。
方法/步驟
首先要了解下分頁的原理即
SELECT * FROM table …… limit 開始位置 , 操作條數(shù)
開始位置從0開始
SELECT * FROM table …… limit 0 , 20
取最前面20條
SELECT * FROM table …… limit 10 , 20
11條到20條
其次分頁要用的公式
得到公式
(當(dāng)前頁數(shù) - 1 )X 每頁條數(shù) , 每頁條數(shù)
Select * from table limit ($Page- 1) * $PageSize, $PageSize
還要了解parse_url()解析URL函數(shù)
parse_url() 是講URL解析成有固定鍵值的數(shù)組的函數(shù)
$ua=parse_url("");
print_r($ua);
結(jié)果:
Array
(
[scheme] = http
[host] = hostname
[user] = username
[pass] = password
[path] = /path
[query] = arg=value
[fragment] = anchor
)
創(chuàng)建數(shù)據(jù)庫bbs和表test有
CREATE TABLE `test` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) character set gb2312 NOT NULL,
`sex` varchar(2) character set gb2312 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
然后插入十幾條測試數(shù)據(jù)即可
寫mysql數(shù)據(jù)庫連接代碼保存conn.php文件里
代碼如下
?php
$conn = @ mysql_connect("localhost", "root", "") or die("數(shù)據(jù)庫鏈接錯(cuò)誤");
mysql_select_db("bbs", $conn);
mysql_query("set names 'GBK'"); //使用GBK中文編碼;
function htmtocode($content) {
$content = str_replace("\n", "br", str_replace(" ", " ", $content));
return $content;
}
//$content=str_replace("'","'",$content);
//htmlspecialchars();
?
寫分頁函數(shù)page.php
代碼如下
?php
function _PAGEFT($totle, $displaypg = 20, $url = '') {
global $page, $firstcount, $pagenav, $_SERVER;
$GLOBALS["displaypg"] = $displaypg;
if (!$page)
$page = 1;
if (!$url) {
$url = $_SERVER["REQUEST_URI"];
}
//URL分析:
$parse_url = parse_url($url);
$url_query = $parse_url["query"]; //單獨(dú)取出URL的查詢字串
if ($url_query) {
$url_query = ereg_replace("(^|)page=$page", "", $url_query);
$url = str_replace($parse_url["query"], $url_query, $url);
if ($url_query)
$url .= "page";
else
$url .= "page";
} else {
$url .= "?page";
}
$lastpg = ceil($totle / $displaypg); //最后頁,也是總頁數(shù)
$page = min($lastpg, $page);
$prepg = $page -1; //上一頁
$nextpg = ($page == $lastpg ? 0 : $page +1); //下一頁
$firstcount = ($page -1) * $displaypg;
//開始分頁導(dǎo)航條代碼:
$pagenav = "顯示第 B" . ($totle ? ($firstcount +1) : 0) . "/B-B" . min($firstcount + $displaypg, $totle) . "/B 條記錄,共 $totle 條記錄";
//如果只有一頁則跳出函數(shù):
if ($lastpg = 1)
return false;
$pagenav .= " a href='$url=1'首頁/a ";
if ($prepg)
$pagenav .= " a href='$url=$prepg'前頁/a ";
else
$pagenav .= " 前頁 ";
if ($nextpg)
$pagenav .= " a href='$url=$nextpg'后頁/a ";
else
$pagenav .= " 后頁 ";
$pagenav .= " a href='$url=$lastpg'尾頁/a ";
//下拉跳轉(zhuǎn)列表,循環(huán)列出所有頁碼:
$pagenav .= " 到第 select name='topage' size='1' onchange='window.location=\"$url=\"+this.value'\n";
for ($i = 1; $i = $lastpg; $i++) {
if ($i == $page)
$pagenav .= "option value='$i' selected$i/option\n";
else
$pagenav .= "option value='$i'$i/option\n";
}
$pagenav .= "/select 頁,共 $lastpg 頁";
}
include("conn.php");
$result=mysql_query("SELECT * FROM `test`");
$total=mysql_num_rows($result);
//調(diào)用pageft(),每頁顯示10條信息(使用默認(rèn)的20時(shí),可以省略此參數(shù)),使用本頁URL(默認(rèn),所以省略掉).
_PAGEFT($total,5);
echo $pagenav;
$result=mysql_query("SELECT * FROM `test` limit $firstcount,$displaypg ");
while($row=mysql_fetch_array($result)){
echo "hrb".$row[name]." | ".$row[sex];
}
?
調(diào)用數(shù)據(jù)和分頁list.php
?php
/**
* 愛微網(wǎng)
*/
include("conn.php");
$pagesize=5;
$url=$_SERVER["REQUEST_URI"];
$url=parse_url($url);
$url=$url[path];
$numq=mysql_query("SELECT * FROM `test`");
$num = mysql_num_rows($numq);
if($_GET[page]){
$pageval=$_GET[page];
$page=($pageval-1)*$pagesize;
$page.=',';
}
if($num $pagesize){
if($pageval=1)$pageval=1;
echo "共 $num 條".
" a href=$url?page=".($pageval-1)."上一頁/a a href=$url?page=".($pageval+1)."下一頁/a";
}
echo $SQL="SELECT * FROM `test` limit $page $pagesize ";
$query=mysql_query($SQL);
while($row=mysql_fetch_array($query)){
echo "hrb".$row[name]." | ".$row[sex];
}
?
注意事項(xiàng)
注意分頁公式寫法你只要記住即可;
(當(dāng)前頁數(shù) - 1 )X 每頁條數(shù) , 每頁條數(shù);
Select * from table limit ($Page- 1) * $PageSize, $PageSize;
注意三個(gè)代碼文件在同一個(gè)目錄下;
主要是最后的list.php調(diào)用代碼要細(xì)看很有用。
第一種:利用Page類和limit方法
$User = M('User'); // 實(shí)例化User對(duì)象
import('ORG.Util.Page');// 導(dǎo)入分頁類
$count = $User-where('status=1')-count();// 查詢滿足要求的總記錄數(shù)
$Page = new Page($count,25);// 實(shí)例化分頁類 傳入總記錄數(shù)和每頁顯示的記錄數(shù)
$show = $Page-show();// 分頁顯示輸出
// 進(jìn)行分頁數(shù)據(jù)查詢 注意limit方法的參數(shù)要使用Page類的屬性
$list = $User-where('status=1')-order('create_time')-limit($Page-firstRow.','.$Page-listRows)-select();
$this-assign('list',$list);// 賦值數(shù)據(jù)集
$this-assign('page',$show);// 賦值分頁輸出
$this-display(); // 輸出模板
第二種:分頁類和page方法的實(shí)現(xiàn)
$User = M('User'); // 實(shí)例化User對(duì)象
// 進(jìn)行分頁數(shù)據(jù)查詢 注意page方法的參數(shù)的前面部分是當(dāng)前的頁數(shù)使用 $_GET[p]獲取
$list = $User-where('status=1')-order('create_time')-page($_GET['p'].',25')-select();
$this-assign('list',$list);// 賦值數(shù)據(jù)集
import(“ORG.Util.Page”);// 導(dǎo)入分頁類
$count = $User-where('status=1')-count();// 查詢滿足要求的總記錄數(shù)
$Page = new Page($count,25);// 實(shí)例化分頁類 傳入總記錄數(shù)和每頁顯示的記錄數(shù)
$show = $Page-show();// 分頁顯示輸出
$this-assign('page',$show);// 賦值分頁輸出
$this-display(); // 輸出模板
帶入查詢條件
如果是POST方式查詢,如何確保分頁之后能夠保持原先的查詢條件呢,我們可以給分頁類傳入?yún)?shù),方法是給分頁類的parameter屬性賦值:
import('ORG.Util.Page');// 導(dǎo)入分頁類
$mapcount = $User-where($map)-count();// 查詢滿足要求的總記錄數(shù)
$Page = new Page($count,25);// 實(shí)例化分頁類 傳入總記錄數(shù)和每頁顯示的記錄數(shù)
//分頁跳轉(zhuǎn)的時(shí)候保證查詢條件
foreach($map as $key=$val) {
$Page-parameter .= "$key=".urlencode($val).'';
}
$show = $Page-show();// 分頁顯示輸出
我們已經(jīng)了解了如何進(jìn)行數(shù)據(jù)查詢,今天我們來學(xué)習(xí)下如何對(duì)數(shù)據(jù)進(jìn)行分頁以及顯示。
獲取分頁類
ThinkPHP提供了數(shù)據(jù)分頁的擴(kuò)展類庫Page,可以在下載,或者下載官方的完整擴(kuò)展包()里面也已經(jīng)包含分頁擴(kuò)展類了。把解壓后的Page.class.php放入ThinkPHP/Extend/Library/ORG/Util/(如果沒有請(qǐng)手動(dòng)創(chuàng)建)目錄下面。
當(dāng)然,擴(kuò)展類庫的位置其實(shí)比較隨意,你也可以放入項(xiàng)目的類庫目錄下面,區(qū)別只是在于你導(dǎo)入路徑的不同而已。
分頁查詢
分頁類需要和查詢相結(jié)合,我們可以使用ThinkPHP自帶的limit方法或者page方法,目的就是為了獲取當(dāng)前分頁的數(shù)據(jù)(也有先獲取完整數(shù)據(jù)然后前端分頁顯示的方法,不在本文描述內(nèi)容中,也不建議)。使用limit方法或者page方法是和數(shù)據(jù)庫類型無關(guān)的。
我們首先在數(shù)據(jù)庫里面創(chuàng)建一個(gè)think_data數(shù)據(jù)表用于測試:
CREATE TABLE IF NOT EXISTS `think_data` (
`id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` varchar(255) NOT NULL,
`create_time` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
復(fù)制代碼
要使用分頁查詢,一般來說需要進(jìn)行兩次查詢,即第一次查詢得到滿足條件的總數(shù)據(jù)量,然后第二次查詢當(dāng)前分頁的數(shù)據(jù),這樣做的作用是告訴分頁類當(dāng)前的數(shù)據(jù)總數(shù),以便計(jì)算生成的總頁數(shù)(如果你的顯示只是需要上下翻頁的話,其實(shí)總數(shù)查詢可以省略或者進(jìn)行緩存)。
一個(gè)標(biāo)準(zhǔn)的分頁使用示例如下:
$Data = M('Data'); // 實(shí)例化Data數(shù)據(jù)對(duì)象
import('ORG.Util.Page');// 導(dǎo)入分頁類
$count = $Data-where($map)-count();// 查詢滿足要求的總記錄數(shù) $map表示查詢條件
$Page = new Page($count);// 實(shí)例化分頁類 傳入總記錄數(shù)
$show = $Page-show();// 分頁顯示輸出
// 進(jìn)行分頁數(shù)據(jù)查詢
$list = $Data-where($map)-order('create_time')-limit($Page-firstRow.','.$Page-listRows)-select();
$this-assign('list',$list);// 賦值數(shù)據(jù)集
$this-assign('page',$show);// 賦值分頁輸出
$this-display(); // 輸出模板
復(fù)制代碼
如果沒有任何數(shù)據(jù)的話,分頁顯示為空白。所以在進(jìn)行測試之前,請(qǐng)確保你的數(shù)據(jù)表里面有一定的數(shù)據(jù),否則可能看不到分頁的效果。如果使用page方法查詢的話,則可以改成:
$Data = M('Data'); // 實(shí)例化Data數(shù)據(jù)對(duì)象
import('ORG.Util.Page');// 導(dǎo)入分頁類
$count = $Data-where($map)-count();// 查詢滿足要求的總記錄數(shù)
$Page = new Page($count);// 實(shí)例化分頁類 傳入總記錄數(shù)
// 進(jìn)行分頁數(shù)據(jù)查詢 注意page方法的參數(shù)的前面部分是當(dāng)前的頁數(shù)使用 $_GET[p]獲取
$nowPage = isset($_GET['p'])?$_GET['p']:1;
$list = $Data-where($map)-order('create_time')-page($nowPage.','.$Page-listRows)-select();
$show = $Page-show();// 分頁顯示輸出
$this-assign('page',$show);// 賦值分頁輸出
$this-assign('list',$list);// 賦值數(shù)據(jù)集
$this-display(); // 輸出模板
復(fù)制代碼
然后,我們?cè)谀0逯刑砑臃猪撦敵鲎兞考纯桑?/p>
table cellpadding=3 cellspacing=5
volist name="list" id="vo"
tr
td [ {$vo.create_time|date='Y-m-d H:i:s',###} ] {$vo.title} /td
/tr
/volist
tr
/tr
/table
div class="result page"{$page}/div
復(fù)制代碼
可以看到分頁輸出只需要采用{$page}變量在模板中輸出即可。
分頁設(shè)置
設(shè)置分頁變量
默認(rèn)情況下,分頁傳值的變量是p,生成的分頁跳轉(zhuǎn)地址可能類似于:
復(fù)制代碼
我們可以配置VAR_PAGE配置參數(shù)來改變:
'VAR_PAGE'='page'
復(fù)制代碼
則分頁地址變成:
復(fù)制代碼
設(shè)置每頁記錄數(shù)
默認(rèn)的情況下,分頁顯示每頁會(huì)顯示20條數(shù)據(jù),如果你希望改變每頁顯示的數(shù)據(jù)量的話,實(shí)例化分頁類的時(shí)候可以傳人第二個(gè)參數(shù)即可:
$Page = new Page($count,5);// 實(shí)例化分頁類 傳入總記錄數(shù)并且每頁顯示5條記錄
復(fù)制代碼
由于查詢方法中我們使用了$Page-listRows屬性,所以無需更改,但如果你是直接在查詢方法中使用數(shù)字請(qǐng)記得一起更改。
下面是官方的分頁示例的顯示效果:
傳入分頁條件
默認(rèn)情況下,分頁類會(huì)自動(dòng)獲取當(dāng)前頁面的POST(優(yōu)先)或者GET變量作為分頁跳轉(zhuǎn)的傳值,如果需要指定傳入當(dāng)前分頁跳轉(zhuǎn)的參數(shù),就可以通過設(shè)置parameter屬性,parameter屬性支持2種方式傳值:字符串和數(shù)組。字符串采用var1=val1var2=val2...的格式,例如:
foreach($map as $key=$val) {
$Page-parameter .= "$key=".urlencode($val).'';
}
復(fù)制代碼
或者直接傳入數(shù)組:
$Page-parameter = array_map('urlencode',$map);
復(fù)制代碼
由于內(nèi)部調(diào)用了U函數(shù),分頁類最終生成的分頁跳轉(zhuǎn)鏈接會(huì)根據(jù)當(dāng)前的URL設(shè)置自動(dòng)生成和當(dāng)前URL模式一致的地址,所以無需擔(dān)心分頁鏈接的參數(shù)影響URL地址。
分頁路由支持
如果你的分頁跳轉(zhuǎn)鏈接地址采用了路由,那么可以通過設(shè)置url參數(shù),例如,假設(shè)我們的分頁URL地址格式是:
復(fù)制代碼
這樣的URL路由地址,那么我們就可以設(shè)置
$Page-url = 'data/index';
復(fù)制代碼
設(shè)置后,分頁類的鏈接地址會(huì)自動(dòng)生成上面的URL格式地址。
注意,url參數(shù)和parameter 同時(shí)使用的話,后者無效。
設(shè)置顯示的頁數(shù)
可以在實(shí)例化分頁類之后,進(jìn)行相關(guān)屬性的設(shè)置。默認(rèn)情況下,頁面顯示的頁數(shù)是5,我們可以修改:
$Page-rollPage = 3;
復(fù)制代碼
這樣,頁面上只能同時(shí)看到3個(gè)分頁
分頁顯示定制
上面講的是分頁的參數(shù)設(shè)置,下面講下如何對(duì)分頁顯示效果(包括樣式)進(jìn)行設(shè)置。默認(rèn)的分頁效果可能不能滿足所有的要求,分頁類提供了一個(gè)setConfig方法來修改默認(rèn)的一些設(shè)置。例如:
$page-setConfig('header','個(gè)會(huì)員');
復(fù)制代碼
setConfig方法支持的屬性包括:
header 頭部描述信息,默認(rèn)值 “條記錄”
prev 上一頁描述信息,默認(rèn)值是“上一頁”
next 下一頁描述信息,默認(rèn)值是“下一頁”
first 第一頁描述信息,默認(rèn)值是“第一頁”
last 最后一頁描述信息,默認(rèn)值是“最后一頁”
theme 分頁主題描述信息,包括了上面所有元素的組合 ,設(shè)置該屬性可以改變分頁的各個(gè)單元的顯示位置,默認(rèn)值是
"%totalRow% %header% %nowPage%/%totalPage% 頁 %upPage% %downPage% %first% %prePage% %linkPage% %nextPage% %end%"
通過setConfig設(shè)置以上屬性可以完美的定制出你的分頁顯示風(fēng)格。
原理:
1.設(shè)定每頁顯示數(shù)
$num = 15;
2.獲取數(shù)據(jù)總數(shù)計(jì)算總頁數(shù)
3.通過get方法獲取頁碼,無獲取值頁碼為1,超過最大頁數(shù)為最大頁面數(shù)
$page = $_GET['page'] ? $_GET['page'] : 1;
4.通過頁碼來計(jì)算當(dāng)前顯示起始記錄
$start = $page*$num-1;
5.通過sql語句查詢
query("select * from tablename limit $start,$num");
然后輸出就行了
頁面上可以循環(huán)輸出1~總頁數(shù) 這些數(shù)字來實(shí)現(xiàn)翻頁,也可以用其他方法
比較方便的方法是,可以去找一個(gè)分頁類
$perNumber=10; //每頁顯示的記錄數(shù)
$page=$_GET['page']; //獲得當(dāng)前的頁面值
$count=mysql_query("select count(*) from td_oa"); //獲得記錄總數(shù)
$rs=mysql_fetch_array($count);
$totalNumber=$rs[0];
$totalPage=ceil($totalNumber/$perNumber); //計(jì)算出總頁數(shù)
if (!isset($page)) {
$page=1;
} //如果沒有值,則賦值1
$startCount=($page-1)*$perNumber; //分頁開始,根據(jù)此方法計(jì)算出開始的記錄
$result=mysql_query("select * from user limit $startCount,$perNumber"); //根據(jù)前面的計(jì)算出開始的記錄和記錄數(shù)
while ($row=mysql_fetch_array($result)) {
echo "user_id:".$row[0]."br";
echo "username:".$row[1]."br"; //顯示數(shù)據(jù)庫的內(nèi)容
}
if ($page != 1) { //頁數(shù)不等于1
?
a href="fenye.php?page=?php echo $page - 1;?"上一頁/a !--顯示上一頁--
?php
}
for ($i=1;$i=$totalPage;$i++) { //循環(huán)顯示出頁面
?
a href="fenye.php?page=?php echo $i;?"?php echo $i ;?/a
?php
}
if ($page$totalPage) { //如果page小于總頁數(shù),顯示下一頁鏈接
?
a href="fenye.php?page=?php echo $page + 1;?"下一頁/a
?php
}
?