小妍儿 发表于 2007-5-21 23:10:12

PHP && mysql分页类

类文件page_class.php
------------------------------------------------------
<?php
         class page {   
                var $pagesize;       //设置每一页显示的记录数
                var $numrows;        //记录总数
                var $pages;          //记录总页数
                var $page;           //设置页数
                var $url;            //Url参数
                var $csql;           //查询记录数的sql语句
                var $sql;
                function page($csql,$sql,$pagesize,$url){
                       
                        //取得记录总数$rs,计算总页数用
                        $rs=mysql_query($csql);
                        $myrow = mysql_fetch_array($rs);
                        $numrows = $myrow ;
                        //计算总页数
                        $pages = intval($numrows/$pagesize);
                        if($numrows%$pagesize)
                        $pages++;
                        //设置页数
                        if(isset($_GET['page'])){
                                $page=intval($_GET['page']);
                        }else{
                                $page = 1;
                        }
                        //计算记录偏移量
                        $offset=$pagesize*($page - 1);
                        //读取指定记录数
                        $rs=mysql_query($sql." limit $offset,$pagesize");
                        if ($myrow=mysql_fetch_array($rs))
                        {
                                $i=0;
                        do {
                                $i++;
                        echo "留言人:".$myrow["leavename"]."&nbsp;&nbsp;&nbsp;时间:".$myrow["leavetime"]."<br /><br/>留言标题:".$myrow["title"]."<br/><br/>留言内容:".$myrow["content"]."<hr><br/>";
                       
                        }
                        while ($myrow=mysql_fetch_array($rs));
                        }
                        echo "<div align='center'>共有".$pages."页(".$page."/".$pages.")";
                        for ($i=1;$i< $page;$i++)
                        echo "<a href='".$url."?page=".$i."'>[".$i ."]</a> ";
                        echo "[".$page."]";
                        for ($i=$page+1;$i<=$pages;$i++)
                        echo "<a href='".$url."?page=".$i."'>[".$i ."]</a> ";
                        echo "</div>";
                        ?>
                        <?php
                        $first=1;
                        $prev=$page-1;
                        $next=$page+1;
                        $last=$pages;

                        if ($page > 1)
                        {
                                echo "<a href='".$url."?page=".$first."'>首页</a> ";
                                echo "<a href='".$url."?page=".$prev."'>上一页</a> ";
                        }

                        if ($page < $pages)
                        {
                                echo "<a href='".$url."?page=".$next."'>下一页</a>";
                                echo "<a href='".$url."?page=".$last."'>尾页</a> ";
                        }                
                }
        }
?>

调用文件test.php
<?php
        require_once("conn.php");
        include("page_class.php");
        $Page = new page("select count(*) from leaves","select * from leaves",2,"test.php");       
?>

说明:功能现在这样完全可以实现
现在问题是:

如何把page_class.php文件中的
echo "留言人:".$myrow["leavename"]."&nbsp;&nbsp;&nbsp;时间:".$myrow["leavetime"]."<br /><br/>留言标题:".$myrow["title"]."<br/><br/>留言内容:".$myrow["content"]."<hr><br/>";
                       
应该写到test.php中来实现   达到通用类的效果。。望各位大虾嘛指点下。。期待中。。

julia_yl 发表于 2007-5-22 09:50:29

请问模板中如何调用?

小妍儿 发表于 2007-5-23 14:04:17

改进后

调用文件test.php
<?php
        require_once("conn.php");
        include("page_class.php");
        $Page = new page("select count(*) from leaves","select * from leaves",2,"test.php");        
?>


这就可以调用,但是通用性不好。。前台显示的样子要在类里面写

所以整理后如下。。您可以参考下。。

[ 本帖最后由 小妍儿 于 2007-5-23 14:13 编辑 ]

小妍儿 发表于 2007-5-23 14:08:50

重新整理

page.php类文件
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
<?php

//PHP分页类
class page
{
    var $count;                 //总记录
        var $cur_page;                //当前页面
        var $sql;                        //数据库语句
        var $conn;                        //数据库连接串
        var $page_size;                //首页显示的记录数
        var $pages;                        //总页数
        var $url;                        //当前页面url
  
  function  page($conn)//构造函数
          {
              $this->conn =$conn;//数据库连接
          }
  
  function init()//初始化函数
    {
    $this->get_count();//获取总纪录数
    $this->get_curpage();//获取当前页数
    $this->get_allpage();//总页数
    $this->url=$_SERVER['PHP_SELF'];//当前页面url
     }  
     
  function open()//获取记录集
    {
     $this->init();//初始化
     if($this->conn)
       {
      $sql=$this->sql." limit ".$this->page_size * $this->cur_page." ,".$this->page_size;
      $rs=mysql_query($sql,$this->conn);
      return $rs;
     }
     else
        return false;
    }
   
  function get_count()//获取总纪录数
    {
     if(isset($_GET['count']))
    $this->count=$_GET['count'];
     else
    {
       $rs=mysql_query($this->sql,$this->conn);
       $this->count=mysql_num_rows($rs);
     }
    }
     
  function get_curpage()//获取当前页数
    {
   if(isset($_GET['cur_page']))
    $this->cur_page=intval($_GET['cur_page'])+0;
     else
    $this->cur_page=0;
     }
     
  function get_allpage()//获取总页数
    {
   if($this->count % $this->page_size)
    $this->pages=intval($this->count / $this->page_size);
   else
    $this->pages=intval($this->count / $this->page_size)-1;
     }
     
//文字分页链接
     
    function first_page($name="首页",$str="",$class_name="")//首页。$name为首页名称,$str为自定义传递字符串,$class_name为CSS类选择标签名(注,以下同)
       {
     if($this->cur_page >0)//当前页大于第一页
      printf("<a href='%s?cur_page=%d&count=%d&$str' class='$class_name'>$name</a>&nbsp;&nbsp;&nbsp;",$this->url,0,$this->count);
     }
         
   function back_page($name="上一页",$str="",$class_name="")//上一页
       {
     if( $this->cur_page > 0)//当前页不是第一页
      printf("<a href='%s?cur_page=%d&count=%d&$str' class='$class_name'>$name</a>&nbsp;&nbsp;&nbsp;",$this->url,$this->cur_page-1,$this->count);
     }
         
    function next_page($name="下一页",$str="",$class_name="")//下一页
       {
     if($this->cur_page<$this->pages)//当前页小于总页数
      printf("<a href='%s?cur_page=%d&count=%d&$str' class='$class_name'>$name</a>&nbsp;&nbsp;&nbsp;",$this->url,$this->cur_page+1,$this->count);
     }
     
   function last_page($name="最后一页",$str="",$class_name="")//尾页
       {
     if( $this->cur_page < $this->pages)//当前页不是最后一页
      printf("<a href='%s?cur_page=%d&count=%d&$str' class='$class_name'>$name</a>",$this->url,$this->pages,$this->count);
     }
}
?>

//调用页面如下
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<?php
     require("page.php"); //类文件
    //连接数据库
    $conn=mysql_connect("localhost","root","")or die("数据库连接失败,请联系管理员!");
    mysql_select_db("test",$conn);
    mysql_query("set names 'gbk'");
    $obj=new page($conn);
    $obj->sql="select * from leaves";//查询语句
    $obj->page_size=2;//每页显示的记录数
    $rs=$obj->open();
    if(false==$rs)
        die("获取记录集失败,请检查数据库连接是否成功!");
    else
      {       
        while($myrow=mysql_fetch_array($rs))
            echo "留言人:".$myrow["leavename"]."&nbsp;&nbsp;&nbsp;时间:".$myrow["leavetime"]."<br /><br/>留言标题:".$myrow["title"]."<br/><br/>留言内容:".$myrow["content"]."<hr><br/>";
        }
    $obj->first_page();
    $obj->back_page();
    $obj->next_page();
    $obj->last_page();
        echo "<br />";

?>

[ 本帖最后由 小妍儿 于 2007-5-23 14:10 编辑 ]

millken 发表于 2007-6-1 09:15:47

类中最好不要有输出, 并且你类的这种写法也不太好
function page($csql,$sql,$pagesize,$url)
在分页类不应该出现SQL语句,下面是我的写法,在分页类中不会出现SQL查询,提高了效率
page($total = 0 , $per = 1 , $midNum = 10 , $num = 3 , $main_page = 'index.php')

小妍儿 发表于 2007-6-4 16:35:54

呵呵..谢谢您的建议,初学,很很多的地方不太懂,以后多多指教

kancnspace 发表于 2007-6-6 16:42:18

太复杂,还是自己写的好。

zyzhao 发表于 2007-8-4 01:07:44

我自己一个函数来搞定

//获取分页
function turnPage($sql, $proFile, $seachStr, $pageSize_p = "")
{
        global $pageSize, $_GET;

        $page                = $_GET["page"];
        $reArray        = array();

        if($pageSize_p != "") $pageSize = $pageSize_p;

        $query = mysql_query($sql);
        $num        = mysql_num_rows($query); //取得总条目数

        //做分页
        $MaxPage        = ceil($num/$pageSize);
        $page = $page ? $page : 1;
        if(!$page or $page <= 1){$start        = 0; $page = 1;}
        elseif($page > $MaxPage){ $start        = ($MaxPage-1) * $pageSize; $page = $MaxPage;}
        else $start        = ($page - 1) * $pageSize;

        $reArray["limit"]        = " LIMIT " . $start . ", " . $pageSize;

        if($pageSize > 1) $reString = " 每页".$pageSize."条,共 ".$MaxPage." 页,第 ".$page." 页&nbsp;&nbsp;&nbsp;&nbsp;";
        else $reString = "共 ".$MaxPage." 页,第 ".$page." 页&nbsp;&nbsp;";
        if($page > 1)
                $reString .= "
          <a href=\"#\" onclick=\"load('".$proFile."?".$seachStr."&page=1')\">首页</a>
          <a href=\"#\" onclick=\"load('".$proFile."?".$seachStr."&page=".($page-1)."')\">上一页</a>";
        else
                $reString .= "
          <font style=\"color:#A9A9A9\">首页 上一页</font>";
        if($page < $MaxPage)
                $reString .= "
          <a href=\"#\" onclick=\"load('".$proFile."?".$seachStr."&page=".($page+1)."')\">下一页</a>
          <a href=\"#\" onclick=\"load('".$proFile."?".$seachStr."&page=".$MaxPage."')\">末页</a> ";
        else
                $reString .= "
          <font style=\"color:#A9A9A9\">下一页 末页</font> ";

        $reArray["page"]        = $reString;

        return $reArray;
}

huizi103 发表于 2007-12-30 18:34:32

谁给写个像51js分页的类或函数啊????

如题!
因为看着漂亮很~~~~
期待中.............

jatx 发表于 2007-12-30 19:34:59

我也正在做一个东东,实现这样的调用:

$m = new Lister;
$m->db = $db;
$m->sql = 'select * from user';
$m->page = $page;
$m->item = <<<EOF
<tr>
        <td>{{字段1}}</td>
        <td>{{字段2}}</td>
        <td>{{字段3}}</td>
</tr>
$m.show();
EOF;

剑枫 发表于 2008-1-3 17:57:58

我也有一个
function Page($_Total, $_Num=30, $_View=10, $_Start_End=true, $_Pre_Next=true, $_Jump=true, $_Rand=false)
{
        if($_Total <= $_Num) return '只有一页';
        $_Link  = eregi('(.+)&page=(+)$', $_Url=basename($_SERVER).'?'.$_SERVER, $_TUrl) ? $_TUrl : $_Url;
        $_CPage = empty($_TUrl) ? 1 : $_TUrl;
        $_Total = floor($_Total/$_Num)+1;
        $_List  = floor($_View/2);
        $_Start = ($_List >= $_CPage) ? $_CPage-($_List-($_List-$_CPage))+1 : $_CPage-$_List;
        $_End   = ($_CPage+$_List>=$_Total) ? $_Total : $_CPage+$_List+($_List-($_CPage-$_Start));

        for($i=$_Start; $i<=$_End; $i++)
        {
                $_Res .= ($i==$_CPage) ? "<a href='#'><b>[$i]</b></a>\n" : "<a href='{$_Link}&page={$i}'>{$i}</a>\n";
        }

        if($_Start_End)
        {
                $_First = "<a href='{$_Link}&page=1'>第一页</a>\n";
                $_End   = "<a href='{$_Link}&page=$_Total'>最末页</a>\n";
        }

        if($_Pre_Next)
        {
                if($_CPage > 1)              $_Pre  = "<a href='{$_Link}&page=".($_CPage-1)."'>上一页</a>\n";
                if($_CPage < $_Total) $_Next = "<a href='{$_Link}&page=".($_CPage+1)."'>下一页</a>\n";
        }

        if($_Jump)
        {
                for($i=1; $i<=$_Total; $i++) { $_Tjump .= ($i==$_CPage) ? "<option value=$i selected>$i</option>" : "<option value=$i>$i</option>"; }
                $_Code = "\n<select onchange=\"location.href='{$_Link}&page='+this.value\">\n{$_Tjump}\n</select>";
        }

        if($_Rand)
        {
                $_Rand = "<a href='{$_Link}&page=".rand(1, $_Total)."'>随机翻页</a>";
        }

        return $_First.$_Pre.$_Res.$_Next.$_End.$_Rand.$_Code;
}

kamon 发表于 2008-2-9 17:11:26

我也來一個

我也來一個

<?php
/*##################################################################
php+mysql分页类,程式设计:kamon,QQ:350665550,欢迎交流!
本分页类有3个属性3个方法
page - 当前页码
count - 总记录数
pagesize - 设置每页显示几条记录
通过设置上面的属性用GetPages()可以获得总页数
get_limit()获得sql查询条件
page_list()输出分页按扭
示例:
require_once("config.php");
require_once("inc_Pagination.php");
$mypage = new Pagination();//使用分页类
$mypage->page=$_GET['page'];//设置当前页
$mypage->pagesize=10;//每页多少条记录
$conn = connetSql();
$mypage->count=mysql_num_rows(mysql_query("select id from dt_content",$conn));//获取并设置数据库总记录数
echo "共有".$mypage->GetPages()."页记录<br/>";//输出有多少页
$sql = "select * from dt_content order by id asc".$mypage->get_limit();//分页条件查询
$rs = mysql_query($sql,$conn);
while($row=mysql_fetch_object($rs)){
        echo $row->id."<br/>";
}
$mypage->page_list("inc_ControlDatabase.php");//输出分页按扭
##################################################################*/
class Pagination {
        public $page=0;//当前页码 - set
        public $count=0;//总记录数 - set
        public $pagesize=0;//分页的每页记录数 - set
        public function Pagination(){
                $this->page=intval($page);
                $this->count=$count;
                $this->pagesize=$pagesize;
        }
        private function Page(){
                $this->pagecount=ceil($this->count/$this->pagesize);
        if ($this->page<=0) $this->page=1;
        if ($this->page>$this->pagecount) $this->page=$this->pagecount;
        return ($this->page);
        }
        //获得总页数 - get
        public function GetPages(){
                return (ceil($this->count/$this->pagesize));
        }
        //计算查询条件 - get
        public function get_limit(){
                $page_num=$this->Page();
                $limit_start = ($page_num-1)*$this->pagesize;
                return " limit ".$limit_start.",".$this->pagesize." ";
        }
        //输出分页按扭 - get
        public function page_list($link=""){
                $page_num=$this->Page();
                $temppage=$index_page=$prev_page=$next_page=$end_page="";
                Switch ($page_num) {
                        Case 1 :
                                $next_page="<a href=".$link."?page=".($page_num+1).">下一页&nbsp;</a>";
                            $end_page="<a href=".$link."?page=".$this->pagecount.">未页</a>";
                                if($this->pagecount==1)$next_page=$end_page="";
                        Break;
                        Case $this->pagecount :
                                $index_page="<a href=".$link."?page=1>首页&nbsp;</a>";
                            $prev_page="<a href=".$link."?page=".($page_num-1).">上一页&nbsp;</a>";
                        Break;
                        Default:
                                $index_page="<a href=".$link."?page=1>首页&nbsp;</a>";
                            $prev_page="<a href=".$link."?page=".($page_num-1).">上一页&nbsp;</a>";
                            $next_page="<a href=".$link."?page=".($page_num+1).">下一页&nbsp;</a>";
                            $end_page="<a href=".$link."?page=".$this->pagecount.">未页</a>";
                        Break;   
                        }
                for($i=1;$i<=$this->pagecount;$i++){
                        if ($i!=$page_num){
                                $temppage.="<a href=".$link."?page=".$i.">[".$i."]</a>"."&nbsp;";
                        }else{
                                $temppage.=$i."&nbsp;";
                        }
                }
                echo "共".$this->count."条记录&nbsp;".$page_num."/".$this->pagecount."页&nbsp;".$index_page.$prev_page.$temppage.$next_page.$end_page;
        }
}
?>

4769946 发表于 2010-3-26 13:37:10

php里也有var关键字?

ybcola 发表于 2010-8-14 14:54:51

其实zend的分页类不错哟

iloveasp 发表于 2010-9-6 06:54:27

php里也有var关键字?
有的,不过在PHP5以后就不推荐使用了。
页: [1]
查看完整版本: PHP && mysql分页类