②$page.=','; 这个的意思是 $page = $page . ','; 他是用来拼写SQL 语句的
可是计算机不知道 你就给他一个算法
记住公式 (总的记录条数 ◆ 每页的记录数 - 1) / 每页的记录数
然后我们看下SQL $sql="select * from message limit $page $pagesize ";
PHP分页方法:
第一步创建一个类 subPages.php?php
class SubPages{
private $each_disNums;//每页显示的条目数
private $nums;//总条目数
private $current_page;//当前被选中的页
private $sub_pages;//每次显示的页数
private $pageNums;//总页数
private $page_array = array();//用来构造分页的数组
private $subPage_link;//每个分页的链接
private $subPage_type;//显示分页的类型
function __construct($each_disNums,$nums,$current_page,$sub_pages,$subPage_link,$subPage_type){
//intval通过使用特定的进制转换(默认是十进制),返回变量 var 的 integer 数值
$this-each_disNums=intval($each_disNums);
$this-nums=intval($nums);
if(!$current_page){
$this-current_page=1;
}else{
$this-current_page=intval($current_page);
}
$this-sub_pages=intval($sub_pages);
$this-pageNums=ceil($nums/$each_disNums);
$this-subPage_link=$subPage_link;
$this-show_SubPages($subPage_type);
//echo $this-pageNums."--".$this-sub_pages;
//__destruct析构函数,当类不在使用的时候调用,该函数用来释放资源
function __destruct(){
unset($each_disNums);
unset($nums);
unset($current_page);
unset($sub_pages);
unset($pageNums);
unset($page_array);
unset($subPage_link);
unset($subPage_type);
//show_SubPages函数用在构造函数里面.而且用来判断显示什么样子的分页
function show_SubPages($subPage_type){
if($subPage_type == 1){
$this-subPageCss1();
//用来给建立分页的数组初始化的函数.
function initArray(){
for($i=0;$i$this-sub_pages;$i◆◆){
$this-page_array[$i]=$i;
return $this-page_array;
//construct_num_Page该函数使用来构造显示的条目
function construct_num_Page(){
if($this-pageNums $this-sub_pages){
$current_array=array();
for($i=0;$i$this-pageNums;$i◆◆){
$current_array[$i]=$i◆1;
$current_array=$this-initArray();
for($i=0;$icount($current_array);$i◆◆){
}elseif ($this-current_page = $this-pageNums $this-current_page $this-pageNums - $this-sub_pages ◆1 ){
$current_array[$i]=($this-pageNums)-($this-sub_pages)◆1◆$i;
return $current_array;
//构造普通模式的分页
function subPageCss1(){
$subPageCss1Str="";
$subPageCss1Str.="共".$this-nums."条记录,";
$subPageCss1Str.="每页显示".$this-each_disNums."条,";
$subPageCss1Str.="当前第".$this-current_page."/".$this-pageNums."页 ";
if($this-current_page 1){
$firstPageUrl=$this-subPage_link."1";
$prewPageUrl=$this-subPage_link.($this-current_page-1);
$subPageCss1Str.="[a href='$firstPageUrl'首页/a] ";
$subPageCss1Str.="[a href='$prewPageUrl'上一页/a] ";
}else {
$subPageCss1Str.="[首页] ";
$subPageCss1Str.="[上一页] ";
if($this-current_page $this-pageNums){
$lastPageUrl=$this-subPage_link.$this-pageNums;
$nextPageUrl=$this-subPage_link.($this-current_page◆1);
$subPageCss1Str.=" [a href='$nextPageUrl'下一页/a] ";
$subPageCss1Str.="[a href='$lastPageUrl'尾页/a] ";
$subPageCss1Str.="[下一页] ";
$subPageCss1Str.="[尾页] ";
echo $subPageCss1Str;
//构造经典模式的分页
$a=$this-construct_num_Page();
for($i=0;$icount($a);$i◆◆){
$s=$a[$i];
if($s == $this-current_page ){
$url=$this-subPage_link.$s;
要做分页的页面?php//每页显示的条数
//得到当前是第几页
$pageCurrent=$_GET["p"];
$offet =($pageCurrent-1)*$page_size;
//建立数据库连接
$conn = mysql_connect("地址","用户名","密码") or die("".mysql_error());
//设置字符集
mysql_query("set names gbk");
//设置数据库
mysql_select_db("数据库名",$conn) or die("".mysql_error());
if($conn) { include ("query.html");
//查询会员信息//注:这里的sql查询了两遍.第一遍是确定查询出来的总数据条数
$query_sql = "SELECT * FROM user_info_t order by id desc";//第二遍是根据需要即$page_size来确定每次查出的条数
$query_sql_sec= "SELECT * FROM user_info_t order by id desc limit $offet,$page_size";
//执行查询语句 返回一个结果集
$query_res = mysql_query($query_sql,$conn);
$query_res_sec = mysql_query($query_sql_sec,$conn);
//查询列数
//$query_cols = mysql_num_fields($query_res);
//查询行数
$query_num =mysql_num_rows($query_res);
//返回根据从结果集取得的行生成的数组,如果没有更多行
while($query_row = mysql_fetch_array($query_res_sec)) {
echo "tr";
for ($i=0;$i$query_cols;$i◆◆) {
//echo "input type='button' class='button' id='modify_record' name='modify_record' value='修改' /";
echo"button onClick=\"submit(location.href='../modify/modify.php?rec_id=$query_row[0]');\"class=\"button\";修改/button";
//echo "ahref='../delete/delete.php?rec_id=$query_row[0]'onClick=\"if(confirm('确实要删除此条记录吗?')) return true;else returnfalse;\"img src=\"../image/delete.gif\" align=\"absmiddle\"/删除/a";
echo "buttononClick=\"if(confirm('确实要删除此条记录吗?')) return submit(location.href='../delete/delete.php?rec_id=$query_row[0]');else return false;\"class=\"button\";删除/button";
echo "/td";
echo "/tr";
//echo "/form";
echo "/table";
require_once("../common/subPages.php");//总条目数为数据库中查询出的数据条数
$nums=$query_num;
//每次显示的页数
$sub_pages=10; //if(!$pageCurrent) $pageCurrent=1;
//调用类SubPages 传的参数为:每页显示条数/当前第几页/每次显示的页数/分页模式
$subPage=new SubPages($page_size,$nums,$pageCurrent,$sub_pages,"query.php?p=",1);
die('数据库连接异常: '.mysql_error());
//断开数据库连接
if ($conn)
{
mysql_close($conn);
①.、前言
分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一.对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,所以呢特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解.本文适合初学者阅读,所有示例代码均使用php编写.
②.、原理
所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:
每页多少条记录($PageSize)?
当前是第几页($CurrentPageID)?
现在只要再给我一个结果集,我就可以显示某段特定的结果出来.
至于其他的参数,比如:上一页($PreviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到.
以mysql数据库为例,如果要从表内截取某段内容,sql语句可以用:select * from table limit offset, rows.看看下面一组sql语句,尝试一下发现其中的规率.
前10条记录:select * from table limit 0,10
......
这一组sql语句其实就是当$PageSize=10的时候取表内每一页数据的sql语句,我们可以总结出这样一个模板:
select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize
拿这个模板代入对应的值和上边那一组sql语句对照一下看看是不是那么回事.搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了.以下我将用具体代码加以说明.
③.、简单代码
请详细阅读以下代码,自己调试运行一次,最好把它修改一次,加上自己的功能,比如搜索等等.
php
// 建立数据库连接
$link = mysql_connect("localhost", "mysql_user", "mysql_password")
or die("Could not connect: " . mysql_error());
// 获取当前页数
if( isset($_GET['page']) ){
$page = intval( $_GET['page'] );
else{
$page = 1;
// 每页数量
$PageSize = 10;
// 获取总数据量
$sql = "select count(*) as amount from table";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$amount = $row['amount'];
// 记算总共有多少页
if( $amount ){
if( $amount $page_size ) //如果总数据量小于$PageSize,那么只有一页
if( $amount % $page_size ){ //取总数据量除以每页数的余数
$page_count = (int)($amount / $page_size) ◆ 1; //如果有余数,则页数等于总数据量除以每页数的结果取整再加一
$page_count = $amount / $page_size; //如果没有余数,则页数等于总数据量除以每页数的结果
$page_count = 0;
// 翻页链接
$page_string = '';
if( $page == 1 ){
$page_string .= '第一页|上一页|';
$page_string .= 'a href="/?page=1";第一页/a|a href="/?page='."($page-1).'上一页/a|';
if( ($page == $page_count) || ($page_count == 0) ){
$page_string .= '下一页|尾页';
$page_string .= 'a href="/?page='."($page◆1).'下一页/a|a href="/?page='."$page_count.'尾页/a';
// 获取数据,以二维数组格式返回结果
$sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size";
while ( $row = mysql_fetch_row($result) ){
$rowset[] = $row;
$rowset = array();
// 没有包含显示结果的代码,那不在讨论范围,只要用foreach就可以很简单的用得到的二维数组来显示结果
④.、OO风格代码
以下代码中的数据库连接是使用的pear db类进行处理
// FileName: Pager.class.php
// 分页类,这个类仅仅用于处理数据结构,不负责处理显示的工作
Class Pager
var $PageSize; //每页的数量
var $CurrentPageID; //当前的页数
var $NextPageID; //下一页
var $PreviousPageID; //上一页
var $numPages; //总页数
var $numItems; //总记录数
var $isFirstPage; //是否第一页
var $isLastPage; //是否最后一页
var $sql; //sql查询语句
function Pager($option)
global $db;
$this-_setOptions($option);
// 总条数
if ( !isset($this-numItems) )
$res = $db-query($this-sql);
$this-numItems = $res-numRows();
// 总页数
if ( $this-numItems 0 )
if ( $this-numItems $this-PageSize )
if ( $this-numItems % $this-PageSize )
$this-numPages= (int)($this-numItems / $this-PageSize) ◆ 1;
else
$this-numPages = $this-numItems / $this-PageSize;
$this-numPages = 0;
switch ( $this-CurrentPageID )
case $this-numPages == 1:
$this-isFirstPage = true;
$this-isLastPage = true;
break;
case 1:
$this-isLastPage = false;
case $this-numPages:
$this-isFirstPage = false;
default:
if ( $this-numPages 1 )
if ( !$this-isLastPage )
if ( !$this-isFirstPage )
return true;
/***
*
* 返回结果集的数据库连接
* 在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小
* 如果结果集不是很大,可以直接使用getPageData的方式获取二维数组格式的结果
* getPageData方法也是调用本方法来获取结果的
***/
function getDataLink()
if ( $this-numItems )
$PageID = $this-CurrentPageID;
$from = ($PageID - 1)*$this-PageSize;
$count = $this-PageSize;
$link = $db-limitQuery($this-sql, $from, $count); //使用Pear DB::limitQuery方法保证数据库兼容性
return $link;
return false;
* 以二维数组的格式返回结果集
function getPageData()
if ( $res = $this-getDataLink() )
if ( $res-numRows() )
while ( $row = $res-fetchRow() )
$result[] = $row;
$result = array();
return $result;
function _setOptions($option)
$allow_options = array(
'PageSize',
'CurrentPageID',
'sql',
'numItems'
);
foreach ( $option as $key = $value )
if ( in_array($key, $allow_options) ($value != null) )
$this-$key = $value;
// FileName: test_pager.php
// 这是一段简单的示例代码,前边省略了使用pear db类建立数据库连接的代码
require "Pager.class.php";
if ( isset($_GET['page']) )
$page = (int)$_GET['page'];
$sql = "select * from table order by id";
$pager_option = array(
"sql" = $sql,
"PageSize" = 10,
"CurrentPageID" = $page
if ( isset($_GET['numItems']) )
$pager_option['numItems'] = (int)$_GET['numItems'];
$pager = @new Pager($pager_option);
$data = $pager-getPageData();
if ( $pager-isFirstPage )
$turnover = "首页|上一页|";
$turnover = "a href='?page=1numItems=".$pager-numItems."'首页/a|a href="/?page=".$pager-PreviousPageID."numItems=".$pager-numItems."'上一页/a|";
if ( $pager-isLastPage )
$turnover .= "下一页|尾页";
$turnover .= "a href="/?page=".$pager-NextPageID."numItems=".$pager-numItems."'下一页/a|a href="/?page=".$pager-numPages."numItems=".$pager-numItems."'尾页/a";
需要说明的地方有两个:
这个类仅仅处理数据,并不负责处理显示,因为我觉得将数据的处理和结果的显示都放到一个类里边实在是有些勉强.显示的时候情况和要求多变,不如自己根据类给出的结果处理,更好的方法是根据这个Pager类继承一个自己的子类来显示不同的分页,比如显示用户分页列表可以:
Class MemberPager extends Pager
function showMemberList()
$data = $this-getPageData();
// 显示结果的代码
// ......
/// 调用
$sql = "select * from members order by id";
$pager = @new MemberPager($pager_option);
$pager-showMemberList();
第二个需要说明的地方就是不同数据库的兼容性,在不同的数据库里截获一段结果的写法是不一样的.
mysql: select * from table limit offset, rows
pgsql: select * from table limit m offset n
所以要在类里边获取结果的时候需要使用pear db类的limitQuery方法.
ok,写完收功,希望花时间看完这些文字的你不觉得是浪费了时间.
回答者
另外,虚机团上产品团购,超级便宜
分页没楼上说的那么复杂,你仔细看看你的打印分页的地方,是在/tr与/table之间,你应该放在一个单元格里.这样他才能显示.
/*
分页步骤:
①给出每页的记录条数
②求出总页数(先得到总条数,再求总页数)
③获得当前页的id值
④得到每个页面的结果集
⑤循环取出
*/
$id=$_GET["id"];
if($id=="")
$id=1;
$paginal=10;
$sql="select * from contents where title=$id";
$rs=mysql_query($sql);
$sum=mysql_num_rows($rs); //信息的总数
$pagination=($sum-1)/$paginal◆1; //信息的总页数
$pagination=(int)$pagination; //总页数取整
$pageno=$_GET["pageno"]; //当前页数
if($pageno=="" || $pageno1)
$pageno=1;
if($pageno$pagination)
$pageno=$pagination;
$startno=($pageno-1)*$paginal; //当前结果集(当前查看第几条)
$sql="select * from contents where title=$id order by id desc limit $startno,$paginal";
tr
td编号/td
td内容/td
/tr
while($rows=mysql_fetch_assoc($rs))
td?php echo $rows["Id"]?/td
td?php echo $rows["Contents"]?/td
td?php echo $rows["Author"]?/td
/table
$recordcount 总数据量
$pernumber 每页显示记录数
$pagelong 显示页码的长度
if(!isset($_GET['page'])){
$_GET['page']='';
if(!isset($p)){
$p='';
if($_GET['page']1||$_GET['page']==""){
$_GET['page']=1;
//总页数小于等于页码长度
if($pagecount=$pagelong){
for($i=1;$i=$pagecount;$i◆◆){
if($i==$_GET['page']){
$p=$p." span$i/span ";
$p =$p." a href='".get_url($i)."' hidefocus$i/a ";
//总页数大于页码长度
//循环页码数
for($i=$_GET['page'];$i=$_GET['page']◆$pagelong-1;$i◆◆){
//判断是否在当前页
if($i==$_GET['page']$_GET['page']!=1){
//输出 当前页前面的
if($i=1){
$p=$p." a href='".get_url($i)."' hidefocus$i/a ";
$p =$p." span$i/span ";
//总页数-当前页码 小于 页码长度
if(($pagecount-$_GET['page'])=$pagelong){
for($i=$_GET['page']◆1;$i=$pagecount;$i◆◆){
//当前页大于等于总页数
if($_GET['page']=$pagecount){
//当前页不是首页
if($_GET['page']!="1"){
$a=$_GET['page']-1;
$p = " a href='".get_url(1)."' hidefocus/a a href='".get_url($a)."' hidefocus/a ".$p;
//}
//当前页不是尾页
if($_GET['page']$pagecount){
$a=$_GET['page']◆1;
$p = $p." a href='".get_url($a)."' hidefocus/a a href='".get_url($pagecount)."' hidefocus/a ";
$p = $p." a href='".get_url($a)."' hidefocus/a ";
return $p;
//获取分页的URL
function get_url($page){
//默认的
if(empty($_SERVER['QUERY_STRING'])){//empty变量是否为空 $_SERVER['QUERY_STRING'] URL中第一个问号?之后的内容
return $_SERVER['PHP_SELF'].'?page='.$page;//$_SERVER['PHP_SELF'] 当前正在执行脚本的文件名
//有分页的
elseif(strpos($_SERVER['QUERY_STRING'],'page')!== false){//strpos获取字符串page首次出现位置(判断是否有参数page)
//有参数
if(strpos($_SERVER['QUERY_STRING'], '') !== false){//有多个参数
$u = explode('page', $_SERVER['QUERY_STRING']);
return $_SERVER['PHP_SELF'].'?'.$u[0].'page='.$page;
//无参数的
return $_SERVER['PHP_SELF'] . '?page=' . $page;
//有参数,无分页的
return $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'page='.$page;
php本身是没有分页概念的,分页是URL传参,然后通过mysql查询语句到数据库获取数据,然后实现的分页,url上的参数,通过PHP的$_GET都是可以获取到的.
以上就是土嘎嘎小编为大家整理的php分页原理及步骤相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!