第一種:利用Page類和limit方法
創(chuàng)新互聯(lián)長期為上1000家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為固原企業(yè)提供專業(yè)的網站制作、成都網站制作,固原網站改版等技術服務。擁有10年豐富建站經驗和眾多成功案例,為您定制開發(fā)。
$User = M('User'); // 實例化User對象
import('ORG.Util.Page');// 導入分頁類
$count = $User-where('status=1')-count();// 查詢滿足要求的總記錄數
$Page = new Page($count,25);// 實例化分頁類 傳入總記錄數和每頁顯示的記錄數
$show = $Page-show();// 分頁顯示輸出
// 進行分頁數據查詢 注意limit方法的參數要使用Page類的屬性
$list = $User-where('status=1')-order('create_time')-limit($Page-firstRow.','.$Page-listRows)-select();
$this-assign('list',$list);// 賦值數據集
$this-assign('page',$show);// 賦值分頁輸出
$this-display(); // 輸出模板
第二種:分頁類和page方法的實現
$User = M('User'); // 實例化User對象
// 進行分頁數據查詢 注意page方法的參數的前面部分是當前的頁數使用 $_GET[p]獲取
$list = $User-where('status=1')-order('create_time')-page($_GET['p'].',25')-select();
$this-assign('list',$list);// 賦值數據集
import(“ORG.Util.Page”);// 導入分頁類
$count = $User-where('status=1')-count();// 查詢滿足要求的總記錄數
$Page = new Page($count,25);// 實例化分頁類 傳入總記錄數和每頁顯示的記錄數
$show = $Page-show();// 分頁顯示輸出
$this-assign('page',$show);// 賦值分頁輸出
$this-display(); // 輸出模板
帶入查詢條件
如果是POST方式查詢,如何確保分頁之后能夠保持原先的查詢條件呢,我們可以給分頁類傳入參數,方法是給分頁類的parameter屬性賦值:
import('ORG.Util.Page');// 導入分頁類
$mapcount = $User-where($map)-count();// 查詢滿足要求的總記錄數
$Page = new Page($count,25);// 實例化分頁類 傳入總記錄數和每頁顯示的記錄數
//分頁跳轉的時候保證查詢條件
foreach($map as $key=$val) {
$Page-parameter .= "$key=".urlencode($val).'';
}
$show = $Page-show();// 分頁顯示輸出
方法/步驟
首先要了解下分頁的原理即
SELECT * FROM table …… limit 開始位置 , 操作條數
開始位置從0開始
SELECT * FROM table …… limit 0 , 20
取最前面20條
SELECT * FROM table …… limit 10 , 20
11條到20條
其次分頁要用的公式
得到公式
(當前頁數 - 1 )X 每頁條數 , 每頁條數
Select * from table limit ($Page- 1) * $PageSize, $PageSize
還要了解parse_url()解析URL函數
parse_url() 是講URL解析成有固定鍵值的數組的函數
$ua=parse_url("");
print_r($ua);
結果:
Array
(
[scheme] = http
[host] = hostname
[user] = username
[pass] = password
[path] = /path
[query] = arg=value
[fragment] = anchor
)
創(chuàng)建數據庫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 ;
然后插入十幾條測試數據即可
寫mysql數據庫連接代碼保存conn.php文件里
代碼如下
?php
$conn = @ mysql_connect("localhost", "root", "") or die("數據庫鏈接錯誤");
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();
?
寫分頁函數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"]; //單獨取出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); //最后頁,也是總頁數
$page = min($lastpg, $page);
$prepg = $page -1; //上一頁
$nextpg = ($page == $lastpg ? 0 : $page +1); //下一頁
$firstcount = ($page -1) * $displaypg;
//開始分頁導航條代碼:
$pagenav = "顯示第 B" . ($totle ? ($firstcount +1) : 0) . "/B-B" . min($firstcount + $displaypg, $totle) . "/B 條記錄,共 $totle 條記錄";
//如果只有一頁則跳出函數:
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 ";
//下拉跳轉列表,循環(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);
//調用pageft(),每頁顯示10條信息(使用默認的20時,可以省略此參數),使用本頁URL(默認,所以省略掉).
_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];
}
?
調用數據和分頁list.php
?php
/**
* 愛微網
*/
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];
}
?
注意事項
注意分頁公式寫法你只要記住即可;
(當前頁數 - 1 )X 每頁條數 , 每頁條數;
Select * from table limit ($Page- 1) * $PageSize, $PageSize;
注意三個代碼文件在同一個目錄下;
主要是最后的list.php調用代碼要細看很有用。
/*
總數據條數????$total;
每頁數據條數??$perpage;
當前頁????$page;
總頁數?$cnt?=?ceil($total/$perpage);?ceil函數+1取整.
在$page頁,說明前面已經過了($page-1)*$perpage條數據
從($page-1)*$perpage+1開始取數據
分頁導航思路:
循環(huán)在當前頁的前后加“a?href=""[]/a”,使其效果為[2][3][4]5[6][7][8]
以下是分頁導航類的代碼
*/
class?PageTool?{
protected?$total?=?0;
protected?$perpage?=?6;
protected?$page?=?1;
public?function?__construct($total,$page=false,$perpage=false)?{
$this-total?=?$total;
if($perpage)?{
$this-perpage?=?$perpage;
}
if($page)?{
$this-page?=?$page;
}
}
//?創(chuàng)建分頁導航
public?function?show()?{
$cnt?=?ceil($this-total/$this-perpage);??//?得到總頁數
$uri?=?$_SERVER['REQUEST_URI'];
$parse?=?parse_url($uri);
$param?=?array();
if(isset($parse['query']))?{
parse_str($parse['query'],$param);
}
//?不管$param數組里,有沒有page單元,都unset一下,確保沒有page單元,
//?即保存除page之外的所有單元
unset($param['page']);
$url?=?$parse['path']?.?'?';
if(!empty($param))?{
$param?=?http_build_query($param);
$url?=?$url?.?$param?.?'';
}
//?計算頁碼導航
$nav?=?array();
$nav[0]?=?'span?class="page_now"'?.?$this-page?.?'/span';
for($left?=?$this-page-1,$right=$this-page+1;($left=1||$right=$cnt)count($nav)?=?5;)?{
if($left?=?1)?{
array_unshift($nav,'a?href="'?.?$url?.?'page='?.?$left?.?'"['?.?$left?.?']/a');
$left?-=?1;
}
if($right?=?$cnt)?{
array_push($nav,'a?href="'?.?$url?.?'page='?.?$right?.?'"['?.?$right?.?']/a');
$right?+=?1;
}
}
return?implode('',$nav);
}
}
//測試分頁導航
$page?=?$_GET['page']?$_GET['page']:1;//???page=5
$p?=?new?PageTool(100,$page,6);?//數據總數100條,每頁6條,當前第5頁
echo?$p-show();//效果為[2][3][4]5[6][7][8]
方法一:講sql查詢進行分頁進行,需要調用幾個函數,具體見腳本:
1.pager.class.php
?php
class pager {
public $sql; //SQL查詢語句
public $datanum; //查詢所有的數據總記錄數
public $page_size; //每頁顯示記錄的條數
protected $_errstr;
protected $_conn;
protected $_query_id;
public function query($query)///這個函數有問題,暫時可以不用
{
$ret = false;
if (!empty($query)) {
if ($this-_conn === false || !is_resource($this-_conn)) {
warningLog(__METHOD__ . ': query sql with no connection', true);
return false;
}
$this-_query_id = @mysql_query($query, $this-_conn);
if ($this-_query_id === false) {
$this-_errstr = @mysql_error();
$ret = false;
} else {
$this-_errstr = 'SUCCESS';
$ret = $this-_query_id;
}
}
$msg = ($ret === false) ? 'false' : strval($ret);
debugLog(__METHOD__.": [$msg] returned for sql query [$query]");
return $ret;
}
function __construct($sql,$page_size) {
$result = mysql_query($sql);
$datanum = mysql_num_rows($result);
$this-sql=$sql;
$this-datanum=$datanum;
$this-page_size=$page_size;
}
//當前頁數
public function page_id() {
if($_SERVER['QUERY_STRING'] == ""){
return 1;
}elseif(substr_count($_SERVER['QUERY_STRING'],"page_id=") == 0){
return 1;
}else{
return intval(substr($_SERVER['QUERY_STRING'],8));
}
}
//剩余url值
public function url() {
if($_SERVER['QUERY_STRING'] == ""){
return "";
}elseif(substr_count($_SERVER['QUERY_STRING'],"page_id=") == 0){
return "".$_SERVER['QUERY_STRING'];
}else{
return str_replace("page_id=".$this-page_id(),"",$_SERVER['QUERY_STRING']);
}
}
//總頁數
public function page_num() {
if($this-datanum == 0){
return 1;
}else{
return ceil($this-datanum/$this-page_size);
}
}
//數據庫查詢的偏移量
public function start() {
return ($this-page_id()-1)*$this-page_size;
}
//數據輸出
public function sqlquery() {
return $this-sql." limit ".$this-start().",".$this-page_size;
}
//獲取當前文件名
private function php_self() {
return $_SERVER['PHP_SELF'];
}
//上一頁
private function pre_page() {
if ($this-page_id() == 1) { //頁數等于1
return "a href=".$this-php_self()."?page_id=1".$this-url()."上一頁/a ";
}elseif ($this-page_id() != 1) { //頁數不等于1
return "a href=".$this-php_self()."?page_id=".($this-page_id()-1).$this-url()."上一頁/a ";
}
}
//顯示分頁
private function display_page() {
$display_page = "";
if($this-page_num() = 10){ //小于10頁
for ($i=1;$i=$this-page_num();$i++) //循環(huán)顯示出頁面
$display_page .= "a href=".$this-php_self()."?page_id=".$i.$this-url()."".$i."/a ";
return $display_page;
}elseif($this-page_num() 10){ //大于10頁
if($this-page_id() = 6){
for ($i=1;$i=10;$i++) //循環(huán)顯示出頁面
$display_page .= "a href=".$this-php_self()."?page_id=".$i.$this-url()."".$i."/a ";
return $display_page;
}elseif(($this-page_id() 6) ($this-page_num()-$this-page_id() = 4)){
for ($i=$this-page_id()-5;$i=$this-page_id()+4;$i++) //循環(huán)顯示出頁面
$display_page .= "a href=".$this-php_self()."?page_id=".$i.$this-url()."".$i."/a ";
return $display_page;
}elseif(($this-page_id() 6) ($this-page_num()-$this-page_id() 4)){
for ($i=$this-page_num()-9;$i=$this-page_num();$i++) //循環(huán)顯示出頁面
$display_page .= "a href=".$this-php_self()."?page_id=".$i.$this-url()."".$i."/a ";
return $display_page;
}
}
}
//下一頁
private function next_page() {
if ($this-page_id() $this-page_num()) { //頁數小于總頁數
return "a href=".$this-php_self()."?page_id=".($this-page_id()+1).$this-url()."下一頁/a ";
}elseif ($this-page_id() == $this-page_num()) { //頁數等于總頁數
return "a href=".$this-php_self()."?page_id=".$this-page_num().$this-url()."下一頁/a ";
}
}
// 設置分頁信息
public function set_page_info() {
$page_info = "共".$this-datanum."條 ";
$page_info .= "a href=".$this-php_self()."?page_id=1".$this-url()."首頁/a ";
$page_info .= $this-pre_page();
$page_info .= $this-display_page();
$page_info .= $this-next_page();
$page_info .= "a href=".$this-php_self()."?page_id=".$this-page_num().$this-url()."尾頁/a ";
$page_info .= "第".$this-page_id()."/".$this-page_num()."頁";
return $page_info;
}
}
?
2.腳本2:
?php
//類的用法
// 讀取分頁類
include("pager.class.php");
// 數據庫連接初始化
// $db = new mysql();
$impeach_host = '10.81.43.139';
$impeach_usr = 'vmtest15';
$impeach_passwd = 'vmtest15';
$impeach_name = 'ufeature';
$impeach_con = mysql_connect($impeach_host, $impeach_usr, $impeach_passwd) or
die("Can't connect ".mysql_error());
mysql_select_db($impeach_name, $impeach_con);
// 這是一個sql查詢語句,并得到查詢結果
$sql = "select word from ufeature.spam_accuse_word_list where flag='0'";
// 分頁初始化
$page = new pager($sql,20);
// 20是每頁顯示的數量
// $res_1 = mysql_query($sql) or
// die("Can't get result ".mysql_error());
$result=mysql_query($page-sqlquery());
while($info = mysql_fetch_array($result,MYSQL_ASSOC)){
// while($info = mysql_fetch_array($res_1, MYSQL_ASSOC)){
echo $info["word"]."br/";
}
// 頁碼索引條
echo $page-set_page_info();
?
方法二:使用ajax的方法
1、首先了解SQL語句中的limit用法
SELECT * FROM table …… limit 開始位置 , 操作條數 (其中開始位置是從0開始的)
例子
取前20條記錄:SELECT * FROM table …… limit 0 , 20
從第11條開始取20條記錄:SELECT * FROM table …… limit 10 , 20
LIMIT n 等價于 LIMIT 0,n。
如select * from table LIMIT 5; //返回前5行,和select * from table LIMIT 0,5一樣
2、分頁原理
所謂分頁顯示,也就是講數據庫中的結果集,一段一段顯示出來
怎么分段,當前在第幾段 (每頁有幾條,當前再第幾頁)
前10條記錄:select * from table limit 0,10
第11至20條記錄:select * from table limit 10,10
第21至30條記錄:select * from table limit 20,10
分頁公式:
(當前頁數 - 1 )X 每頁條數 , 每頁條數
Select * from table limit ($Page- 1) * $PageSize, $PageSize
3、$_SERVER["REQUEST_URI"]函數
預定義服務器變量的一種,所有$_SERVER開頭的都叫做預定于服務器變量。
REQUEST_URI的作用是取得當前URI,也就除域名外后面的完整的地址路徑。
例子:
當前頁為:;cid=22
echo $_SERVER["REQUEST_URI"]
結果為:/home.php?id=23cid=22
4、parse_url()解析URL函數
parse_url() 是講URL解析成有固定鍵值的數組的函數
例子
$ua=parse_url("");
print_r($ua);
結果:
Array
(
[scheme] = http ;協(xié)議
[host] = hostname ;主機域名
[user] = username ;用戶
[pass] = password ;密碼
[path] = /path ;路徑
[query] = arg=value ;取參數
[fragment] = anchor ;
)
5、代碼實例
這個一個留言的分頁,分為3個部分,一個是數據庫設計,一個是連接頁面,一個是顯示頁面。
(1)設計數據庫
設計數據庫名為bbs,有一個數據表為message,里面包含title,lastdate,user,content等字段,分別表示留言標題,留言日前,留言人,留言的內容
(2)連接頁面
?php
$conn = @ mysql_connect("localhost", "root", "123456") or die("數據庫鏈接錯誤");
mysql_select_db("bbs", $conn);
mysql_query("set names 'GBK'"); //使用GBK中文編碼;
//將空格,換行轉換為HTML可解析
function htmtocode($content) {
$content = str_replace("\n", "br", str_replace(" ", " ", $content)); //兩個str_replace嵌套
return $content;
}
//$content=str_replace("'","‘",$content);
//htmlspecialchars();
?
(3)顯示頁面
?php
include("conn.php");
$pagesize=2; //設置每頁顯示2個記錄
$url=$_SERVER["REQUEST_URI"];
$url=parse_url($url);
$url=$url[path];
$numq=mysql_query("SELECT * FROM `message`");
$num = mysql_num_rows($numq);
if($_GET){
$pageval=$_GET;
$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";
}
$SQL="SELECT * FROM `message` limit $page $pagesize ";
$query=mysql_query($SQL);
while($row=mysql_fetch_array($query)){
?
table width=500 border="0" cellpadding="5" cellspacing="1" bgcolor="#add3ef"
tr bgcolor="#eff3ff"
td標題:?php echo $row[title]?/td td時間:?php echo $row[lastdate]?/td
/tr
tr bgcolor="#eff3ff"
td 用戶:?php echo $row[user]?/tdtd/td
/tr
tr
td內容:?php echo htmtocode($row[content]);?/td
/tr
br
/table
?php
}
?
方法3:
script
function viewpage(p){
if(window.XMLHttpRequest){
var xmlReq = new XMLHttpRequest();
} else if(window.ActiveXObject) {
var xmlReq = new ActiveXObject('Microsoft.XMLHTTP');
}
var formData = "page="+p;
xmlReq.onreadystatechange = function(){
if(xmlReq.readyState == 4){
document.getElementByIdx_x('content2').innerHTML = xmlReq.responseText;
}
}
xmlReq.open("post", "hotel_list.php", true);
xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlReq.send(formData);
return false;
}
/script
腳本2:
header("Content-Type:text/html;charset=GB2312");
$pagesize=10;
//echo $_POST['page'];
$result = mysql_query("Select count(DISTINCT hotelname) FROM ".TBL_HOTELS);
$myrow = mysql_fetch_array($result);
$numrows=$myrow[0];
$pages=intval($numrows/$pagesize);
if ($numrows%$pagesize)
$pages++;
if (isset($_POST['page'])){
$page=intval($_POST['page']);
}
else{
//設置為第一頁
$page=1;
}
$first=1;
$prev=$page-1;
$next=$page+1;
$last=$pages;
//計算記錄偏移量
$offset=$pagesize*($page - 1);
//讀取指定記錄數
$result=mysql_query("select `hotelname` , count( * ) from ".TBL_HOTELS." GROUP BY `hotelname` order by id desc limit $offset,$pagesize");
$num = mysql_num_rows($result);
while ($row = mysql_fetch_array($result,MYSQL_NUM)) {
$hotelname[] = $row[0];
$countpeople[] = $row[1];
}
for($a=0;$a$num;$a++)
{
//$result=mysql_query("select count(title) from " . TBL_Comments ." where `title`=\"".$title[$a]."\"");
//$row = mysql_fetch_row($result);
echo "TABLE style=\"MARGIN-BOTTOM: 20px\" cellSpacing=0 cellPadding=0 width=100% border=0\n";
echo "TBODY\n";
echo "TR\n";
echo "TD style=\"PADDING-TOP: 5px\" vAlign=top align=left width=80\n";
//rating_bar($title[$a],5);
echo "/TD\n";
echo "TD style=\"PADDING-TOP: 5px\" align=left width=100%A title=$hotelname[$a] style=\"FONT-SIZE: 14px\" href=#$hotelname[$a]/A\n";
echo "/TD/TR\n";
echo " TR\n";
echo "TD/TD\n";
echo "TD style=\"PADDING-LEFT: 0px\"\n";
echo "IMG src=\"images/comment.gif\" border=0 推薦人數:($countpeople[$a]) |\n";
echo "SPAN平均分:STRONG/STRONG (".$count."票) | 評論數:()/SPAN\n";
echo "/TD/TR/TBODY/TABLE\n";
}
echo "TABLE style=\"MARGIN-TOP: 30px\" cellSpacing=0 cellPadding=0 width=\"100%\"";
echo "border=0";
echo "TBODYTRTD colSpan=3 height=20";
echo "DIV align=center";
echo "P align=leftFONT color=red第".$page."頁/總".$pages."頁 | 總".$numrows."條/FONT | ";
if ($page1) echo "a onclick=\"viewpage(".$first.")\" href='#'首頁/a | ";
if ($page1) echo "a onclick=\"viewpage(".$prev.")\" href='#'上頁/a | ";
if ($page$pages) echo "a onclick=\"viewpage(".$next.")\" href='#'下頁/a | ";
if ($page$pages) echo "a onclick=\"viewpage(".$last.")\" href='#'尾頁/a";
echo "轉到第 INPUT maxLength=3 size=3 value=1 name=goto_page 頁 INPUT hideFocus onclick=\"viewpage(document.all.goto_page.value)\" type=button value=Go name=cmd_goto";
echo "/P/DIV/TD/TR/TBODY/TABLE";
文章標題:php數據分頁 php數據庫分頁是怎么實現的
文章位置:http://jinyejixie.com/article24/ddccije.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站導航、做網站、自適應網站、外貿建站、標簽優(yōu)化、外貿網站建設
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)