Friday, July 30, 2010

PHP中结合ajax实现局部刷新的分页


需要如下方面的知识

!. PHP 中的类的使用(Language Reference http://www.php.net/manual/en/langref.php), 字符串处

理函数的调用(http://www.php.net/manual/en/book.strings.php),php 中 函数库参考

http://www.php.net/manual/en/funcref.php

2.PHP 中连接MySQL数据库的方法(http://us3.php.net/manual/en/ref.mysql.php

3. jQuery库中的ajax功能支持(http://jquery.com

4. javascript中的JSON (参考我前几天写的文章)


MySQL中的数据结构如下








------------------------index.php内容 -------------------------------------------------

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   xml:lang="zh-CN" lang="zh-CN">


<head>
  <script type="text/javascript" src="./jquery-1.2.3.js"></script>


<style type="text/css">
#messagebox {
  width:80% ;

  background:#eeeeee;
}


.item{
  width:100% ;

}


.nav { margin: 5px 0}
.nav a  { margin: 0 0px; padding: 3px 5px; border: 1px solid #ccc; background: #fc0; text-decoration: none }
.nav a:focus { outline: hand; }


</style>
</head>


<form  name=myform method=post  action=index.php>
<body>
<!--


<input type=text  name=mytextbox>  <input type=submit   name=submit value="测试一下" > 
-->


<div id=messagebox>

</div>

<div  class="nav">
          <a onclick="showpage(0)">1</a>
          <a onclick="showpage(1)">2</a>
          <a onclick="showpage(2)">3</a>
          <a onclick="showpage(3)">4</a>
          <a onclick="showpage(4)">5</a>


<div>
<script>
var  row = [
{ author: "11" , content:"12",time: "2007:20;30" },
{ author: "21" , content:"22" ,time: "2007:20;30"},
];


//alert (row[0].dd);


function  insertMessage( messages)
{
        $("#messagebox").html("");
         for (var  i=0; i<10;i++)
        {
                 if (messages[i]  != null)
                 {   


                        var html = $("#messagebox").html()
                                       + "<div class=item>" 
           + "<table border=2 width=100% height=100%> <tr> <td width=20%>"
           + "<span>作者:"
           + messages[i].author
           + "</span><br>"
           + "<span>发贴时间:"
           + messages[i].time
                                       + "</span> "
                                       + "</td>  <td>"
                                       +messages[i].content
                                      + "</td></tr> <table>"
                                      + "</div>" ;
                        $("#messagebox").html ( html);
                    
                 }else{
                            break;
                }
        }

}
 

function showpage( number)
{
    $("#messagebox").html(" <div   style='background:#ffff00;width:200px'>正在加载数据请稍候.....<div>");
    var  pagenum = number.toString() ;
    $.get("http://localhost/php/request.php",     //请求的地址
     { page:  pagenum },  //要传给服务器的参数    相当于在浏览器地址栏输入 http://localhost/php/request.php?page=0   这样
    function(data){            //ajax获取成功的函数
//  alert("Data Loaded: " + data);
                // data =  data.replace("\r\n"," ");
  var allMessages = eval_r( "(" + data + ")" );
              //  var allMessages = eval_r( data );
     if  (allMessages[0].content != null)
    {
                       insertMessage(allMessages);
    }
          
    });



}



showpage(0);
//insertMessage(row);


</script>

</body>
</form>
</html>



<?php
    
?>




---------------------request.php内容 ----------------------------------------

<?php
//include  ("pager.php" );
  require_once  ("pager.php" );


$link= mysql_connect ("localhost" ,"root", "");
if (!$link) {
     die('Could not connect: ' . mysql_error());
}
//echo 'Connected successfully';



mysql_query("SET NAMES 'gb2312'",$link);  //gb312为数据库中编码格式


if(!isset($_GET['page'])){$page = 0;}else{$page = $_GET['page'];}
$pagedemo = new pageclass;
$pagedemo->set_sql("SELECT * FROM  widebright.message ORDER BY Time DESC");
$pagedemo->set_params("type=".$type."");
$pagedemo->set_setpage($page);
$pagedemo->set_pagesize(2);
$pagedemo->set_filename("request.php");
$pagedemo->set_pagenumber(1);
$pagedemo->show();
$result=$pagedemo->result;
$n=0;


echo "[";
  while ($row=mysql_fetch_row($result)){
       $n++;     
       $message = array (
      "time"  =>  $row[2],
      "content" => $row[3],
      "author"    =>  $row[4],
          );   
        
       echo "{", "time" , ":\"", str_replace("\r\n","<br>", $row[2] ),
        "\"," ,"content" , ": \"", str_replace("\r\n","<br>", $row[3]) ,
        "\"," , "author" , ": \"",   str_replace("\r\n","<br>",$row[4]) , "\"} , \n"  ;
      
    // echo json_encode( $message);    好像这个不支持中文
      
  }


echo "]";


//$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);


//echo json_encode($arr);
// $pagedemo->showpage();
//echo  "哈哈哈";


mysql_close($link);


?>

------------------------pager.php内容 -----------------------------------------


<?php


class pageclass
{

var $sqlstr,$filename,$params,$initfirstpage;
var $pagestart,$pagenumber,$pagesize,$i;
var $firstpage,$prevpage,$nextpage,$lastpage;
var $totallines,$maxpage,$totalpages,$result;
var $page,$final,$getpage,$param,$paramlist;


function pageclass()
{
  $this->set_initfirstpage("仅此一页"); // 设置只有一页时显示的文字;
  $this->set_setpage(0);                 // 设置默认第一页为0;
  $this->set_pagesize(10);               // 设置默认记录数为10;
  $this->set_params("");                 // 设置默认参数列表为空;
  $this->set_pagestart(0);               // 设置默认分页起始数为0;
  $this->set_pagenumber(5);              // 设置默认每页显示页数为5;
  $this->set_firstpage("|<<");           // 设置默认上N页表示字符为|<<;
  $this->set_prevpage("<<");             // 设置默认上一页表示字符为<<;
  $this->set_nextpage(">>");             // 设置默认下一页表示字符为>>;
  $this->set_lastpage(">>|");            // 设置默认下N页表示字符为>>|;
}


function set_sql($sqlstr)
{
  $this->sqlstr = $sqlstr;
}


function set_pagesize($pagesize)
{
  $this->pagesize = $pagesize;
}


function set_filename($filename)
{
  $this->filename = $filename;
}


function set_params($params)
{
  $this->params = $params;
}


function set_pagestart($pagestart)
{
  $this->pagestart = $pagestart;
}


function set_pagenumber($pagenumber)
{
  $this->pagenumber = $pagenumber;
}


function set_firstpage($firstpage)
{
  $this->firstpage = $firstpage;
}


function set_prevpage($prevpage)
{
  $this->prevpage = $prevpage;
}


function set_nextpage($nextpage)
{
  $this->nextpage = $nextpage;
}


function set_lastpage($lastpage)
{
  $this->lastpage = $lastpage;
}


function set_initfirstpage($initfirstpage)
{
  $this->initfirstpage = $initfirstpage;
}


function set_setpage($getpage)
{
  $this->getpage = $getpage;
}


function show()
{
  $this->final = '';
  $this->param = preg_replace("/&?page=[0-9]*&?/", '', $this->params);
  $this->totallines = mysql_num_rows(mysql_query($this->sqlstr));
  if(isset($this->totallines))
  {
    $this->totalpages = ceil($this->totallines / $this->pagesize);
  }else{
    $this->totalpages = 1;
  }
  $this->result = mysql_query($this->sqlstr." limit ".$this->getpage * $this->pagesize .", ". $this->pagesize);
}


function showpage()
{
  if($this->totalpages > $this->pagenumber && $this->getpage > $this->pagenumber - 1)
  {
    $this->paramlist = '?page='.($this->getpage - $this->pagenumber);
    $this->paramlist .= "&".$this->param;
    $this->final .= "<a href=./".$this->filename.$this->paramlist.">".$this->firstpage."</a> ";
    $this->pagestart = intval($this->getpage / $this->pagenumber) * $this->pagenumber;
  }else $this->final .= $this->firstpage." ";
  if($this->getpage)
  {
    $this->paramlist  = '?page='.($this->getpage - 1);
    $this->paramlist .= "&".$this->param;
    $this->final .= "<a href=./".$this->filename.$this->paramlist.">".$this->prevpage."</a> ";
  } else $this->final .= $this->prevpage." ";
  if($this->totalpages < $this->pagenumber)
  {
    $this->maxpage = $this->totalpages;
  }else{
    $this->maxpage = $this->pagenumber;
  }
  for($this->i = $this->pagestart, $this->paramlist = '', $this->maxpage += $this->pagestart; $this->i < $this->maxpage; $this->i ++) {
    $this->paramlist .= '?page='.$this->i;
    $this->paramlist .= "&".$this->param;
    if($this->i != $this->getpage)
    {
     $this->final .= "<a href=./".$this->filename.$this->paramlist.">".($this->i + 1).'</a> ';
    }else{
     $this->final .= "<a href=./".$this->filename.$this->paramlist."><strong>".($this->i + 1).'</strong></a> ';
    }
    $this->paramlist = '';
  }
  if((++ $this->getpage)< $this->totalpages)
  {
    $this->paramlist  = "?page=".$this->getpage;
    $this->paramlist .= "&".$this->param;
    $this->final .= "<a href=./".$this->filename.$this->paramlist.">".$this->nextpage."</a> ";
  } else $this->final .= " ".$this->nextpage;
  $this->getpage --;
  if(($this->getpage + $this->pagenumber) < $this->totalpages)
  {
    $this->paramlist = '?page='.($this->getpage + $this->pagenumber);
    $this->paramlist .= "&".$this->param;
    $this->final .= " <a href=./".$this->filename.$this->paramlist.">".$this->lastpage."</a>";
  } else $this->final .= " ".$this->lastpage;
  if($this->maxpage == 1) $this->final = $this->initfirstpage;
  print $this->final;
}

}

?>


---------------------------------------------------------------------------

index.php是主要显示页面, request.php是ajax后台数据提供页面,pager.php是网上下载的一个分页类。

最后运行效果如图。








总结:看到有人在网上问PPlive论坛的分页的问题,看到他是采用局部刷新的分页,刚好在看看php所以写了一个简单的例子,熟练一下语法。 不过PPlive那个是还结合jQuery里面的分页插件,做了层隐藏等的,他一次下载很多条记录,然后通过层的显示来控制浏览所有的数据。

这个只是个简单的例子,如果是实际应用,可以把页码导航那个放到php服务端生成的比较好。

0 评论:

Post a Comment