我用PHP做分页显示遇到一个问题。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我用PHP做分页显示遇到一个问题。相关的知识,希望对你有一定的参考价值。
页面除了上一页,下一页连接,还需要1,2,3,4,5...这样的页号跳转吧?那么这肯定是需要知道总记录数?这样的话是将所有记录全读出,然后得出总记录数再进行分页?还是先读出记录总数再读出指定数量(每页显示30个)的记录进行分页?
参考技术A <?php class Page// public param
public $pageName = 'page'; // 默认 page 标签,即 filename.php?pageName=4 中的 pageName
public $prevPage = '<'; // 上一页
public $nextPage = '>'; // 下一页
public $prevBar = '<<'; // 上一分页条
public $nextBar = '>>'; // 下一分页条
// private param
private $_totalNums = 1; // 总记录数
private $_barNum = 10; // 分页条显示分页个数
private $_totalPage = 0; // 总页数
private $_nowPage = 1; // 当前页
private $_perPage = 10; // 每页显示记录数
private $_preUrl = ''; // url 前缀
private $_preNow = 0; // 当前页前显示分页个数 (范围应该是 0 至 $_barNum-1)
private $_fromPage = 0; // 分页条起点
private $_toPage = 0; // 分页条末端
private $_offset = 0; // sql 查询记录偏移量
// public functions -----------------------------------------------------------------
// 构造函数 初始化分页变量
// @param $nums int 总记录数
// @param $per int 每页显示记录数
// @param $now int 当前页数
// @param $url string url前缀 默认为空
public function __construct($nums, $per = '', $preNow = '', $barNum = '', $now = '', $url = '')
// 初始化
$this->_set($nums, $per, $preNow, $barNum, $now, $url);
$this->_totalPage = ceil($this->_totalNums/$this->_perPage);
$this->_offset = ($this->_nowPage - 1) * $this->_perPage;
// 上一页
public function getPrevPage()
// 当前页不是第一页
if($this->_nowPage > 1)
return $this->_setLink($this->_setUrl($this->_nowPage - 1), $this->prevPage, 'prevpage');
// 下一页
public function getNextPage()
// 当前页小于总页数
if($this->_nowPage < $this->_totalPage)
return $this->_setLink($this->_setUrl($this->_nowPage + 1), $this->nextPage, 'nextpage');
// 第一页
public function getFirstPage()
// 起点不是第一页
if(($this->_nowPage - $this->_preNow) > 1)
return $this->_setLink($this->_setUrl(1), '1...', 'firstpage');
// 最后一页
public function getLastPage()
// 末端不大于总页数
if(($this->_nowPage - $this->_preNow + $this->_barNum) <= $this->_totalPage)
return $this->_setLink($this->_setUrl($this->_totalPage), '...' . $this->_totalPage, 'lastpage');
// 上一分页条
public function getPrevBar()
// 起点大于一个分页条数
if(($this->_nowPage - $this->_preNow) > $this->_barNum)
return $this->_setLink($this->_setUrl(($this->_nowPage - $this->_preNow) - $this->_barNum), $this->prevBar, 'prevbar');
// 下一分页条
public function getNextBar()
// 末端不大于总页数
if(($this->_nowPage - $this->_preNow + $this->_barNum) <= $this->_totalPage)
return $this->_setLink($this->_setUrl($this->_fromPage + $this->_barNum), $this->nextBar, 'nextbar');
// 分页条
public function pageBar()
// 初始化分页条的始末端点
$this->_toPage = $this->_nowPage + ($this->_barNum - $this->_preNow - 1);
if($this->_toPage > $this->_totalPage)
$this->_preNow = $this->_barNum - ($this->_totalPage - $this->_nowPage + 1);
$this->_toPage = $this->_totalPage;
if($this->_toPage < $this->_barNum)
$this->_toPage = $this->_barNum;
$this->_fromPage = $this->_nowPage - $this->_preNow;
if($this->_fromPage < 1)
$this->_fromPage = 1;
// 初始化分页条
$return = '';
for($i = $this->_fromPage; $i <= $this->_toPage; $i++)
if($i != $this->_nowPage)
$return .= $this->_setLink($this->_setUrl($i), $i, 'page');
else
$return .= '<span class="nowpage">' . $i . '</span>';
return $return;
// 返回偏移量 用于 sql 查询
public function getOffset()
return $this->_offset;
// 返回总记录数
public function getTotalNums()
return '<span class="totalnums">' . $this->_totalNums . '</span>';
// 显示分页
public function showPage()
return $this->getTotalNums() . $this->getFirstPage() . $this->getPrevBar() . $this->getPrevPage() . $this->pageBar() . $this->getNextPage() . $this->getNextBar() . $this->getLastPage();
// private functions ----------------------------------------------------------------
//
private function _set($nums, $per, $preNow, $barNum, $now, $url)
// 设置总记录数
if($nums > 0)
$this->_totalNums = $nums;
// 设置每页显示记录数
if($per > 0)
$this->_perPage = $per;
// 设置当前页前显示分页个数
if($preNow > 0)
$this->_preNow = $preNow;
// 设置分页条链接个数
if($barNum > 0)
$this->_barNum = $barNum;
// 设置当前页
if(empty($now))
// 自动获取
if(isset($_GET[$this->pageName]))
$this->_nowPage = intval($_GET[$this->pageName]);
else
// $now 已手动处理
$this->_nowPage = intval($now); //
// 设置 url 前缀
if(!empty($url))
// $url 已手动处理
$this->_preUrl = $url . (stristr($url, '?') ? '&' : '?') . $this->pageName . '=';
else
// 自动获取
if(empty($_SERVER['QUERY_STRING']))
// url 中不存在查询
$this->_preUrl = $_SERVER['REQUEST_URI'] . '?' . $this->pageName . '=';
else
if(stristr($_SERVER['QUERY_STRING'], $this->pageName . '='))
// 查询中有 page=n(2,3...)
$this->_preUrl = str_replace($this->pageName . '=' . $this->_nowPage, '', $_SERVER['REQUEST_URI']);
$lastCharacter = $this->_preUrl[strlen($this->_preUrl) - 1];
if($lastCharacter == '?' || $lastCharacter == '&')
// page=n(2,3...) 在原 url 的末尾
$this->_preUrl .= $this->pageName . '=';
else
// page=n(2,3...) 不在原 url 的末尾
$this->_preUrl .= '&' . $this->pageName . '=';
else
// 查询中没有 page=n(2,3...)
$this->preUrl = $_SERVER['REQUEST_URI'] . '&' . $this->pageName . '=';
// 设置链接地址
private function _setUrl($pageNo)
return $this->_preUrl . $pageNo;
// 设置链接
private function _setLink($url, $link, $style = '')
$style = 'class="' . $style . '"';
return '<a href="' . $url . '" ' . $style . '>' . $link . '</a>';
//
使用方法
$total = 1245;
//class Page($nums, $per = '', $preNow = '', $barNum = '', $now = '', $url = '')
$page = new Page($total);
$pager = $page->showPage();
$smarty->assign('pager', $pager);
$smarty->display('index.tpl');本回答被提问者采纳 参考技术B 从数据库查询所有记录用COUNT()函数即可获取当前总条数的!
用PHP+MySQL来做分页的演示
用php做分页弄懂逻辑关系其实不难,不过我在听课的时候估计是被老师讲的那些变量里的英文单词给听懵了,因为有几个变量的名字都很像,只是换了两三个英文字母而已,有的就少几个这样的,听到一半已经不知道老师讲的这个变量代表的是什么了,写这个也只是为了复习一下,温故而知新嘛。
英文翻译:page:页 per:由,依靠
//引用数据库 下面附赠一个连接数据库的包装函数使用sql语句时用my_query()这个函数;include ./MySQLDB.php;
//先设置当前选中的页码数
$pageNum = isset($_GET[‘num‘]) ? $_GET[‘num‘] : 1;
//定义每一页显示的记录数
$rowsPerPage = 5;
//查询总记录数
$sql = "select count(*) from publish";
$result = my_query($sql);
$rows = mysql_fetch_row($result);
$rowCount = $rows[0];//总记录数
//计算总页数
$pages = ceil($rowCount/$rowsPerPage); //总页数=向上取整(总记录数/每一页显示的记录数)
//拼凑出页码字符串
$strPage = ‘‘; //这里是定义一个空字符串,然后用连接的方式把HTML的标记和内容都串联起来
//先拼凑出首页
$strPage .="<a href=‘./list_father.php?num=1‘>首页</a>";
//拼凑出上一页
$preNum = $pageNum == 1 ? 1 : $pageNum-1;
$strPage .="<a href=‘./list_father.php?num=$preNum‘>上一页</a>";
//显示的初始页
if($pageNum <= 3){
$startNum = 1;
}else{
$startNum = $pageNum-2;
}
//显示的初始页最大值
if($startNum >=$pageNum - 4){ //要显示的是五个页数所以初始页的最大值不能大于当前页—4
$startNum = $pageNum -4;
}
//防止页码出现负值
if($startNum <=1){
$startNum = 1;
}
//确定显示的最后一页$endNum
$endNum = $startNum + 4; //要显示的是五个页数所以最后一页必定是初始页+4
//防止最后一页出界
if($endNum>=$pages){ //最后一页大过总页就让他数字变总页的数字
$endNum = $pages;
}
for($i=$startNum;$i<=$endNum;$i++){ //拿初始页和最后一页循环比大循环,循环5次
if($i==$pageNum){ //当前的页码数被选中就给它样式区分其他页的页码数
$strPage .= "<a href=‘./list_father.php?num=$i‘><font color=blue>$i</font></a>";
}else{
$strPage .= "<a href=‘./list_father.php?num=$i‘>$i</a>";
}
}
//拼凑出下一页
$nextNum = $pageNum == $pages ? $pages : $pageNum+1;
$strPage .= "<a href=‘./list_father.php?num=$nextNum‘>下一页</a>";
//拼凑出尾页
$strPage .= "<a href=‘./list_father.php?num=$pages‘>尾页</a>";
//分页到此结束
<?php
function my_connect($arr){
//接受参数
$host = isset($arr[‘host‘]) ? $arr[‘host‘]:‘主机名字‘;
$port = isset($arr[‘$port‘]) ? $arr[‘port‘]:‘端口号‘;
$user = isset($arr[‘user‘]) ? $arr[‘user‘]:‘用户类型‘;
$pass = isset($arr[‘isset‘]) ? $arr[‘isset‘]:‘自己设置的密码‘;
$link = @ mysql_connect("$host:$port",$user,$pass);
if(!$link){
//数据库连接失败
echo "数据库连接失败!<br/>";
echo "错误编号:",mysql_errno(),"<br/>";
echo "错误信息:",mysql_error(),"<br/>";
die;
}
}
function my_query($sql){
//先执行sql语句
$result = mysql_query($sql);
//判断是否执行成功
if(!$result){
//输出相关错误信息
echo "sql语句执行失败!<br/>";
echo "错误sql语句是:",$sql,"<br/>";
echo "错误编号:",mysql_errno(),"<br/>";
echo "错误信息:",mysql_error(),"<br/>";
die;
}
return $result;
}
//设置默认字符集
function my_charset($charset){
$sql = "set names $charset";
my_query($sql);
}
//设置默认数据库
function my_database($db_name){
$sql = "use $db_name";
my_query($sql);
}
//连接数据库
$arr = array(
"user" => "用户类型",
"pass" => "设置的密码"
);
//连接数据三部曲
my_connect($arr);
my_charset(‘字符集‘);
my_database(‘要选择的数据库‘);
以上是关于我用PHP做分页显示遇到一个问题。的主要内容,如果未能解决你的问题,请参考以下文章