`
kefeng
  • 浏览: 15454 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

php之MySQL完美分页

 
阅读更多

自己学的MySQL完美分页,觉得以后用的着就写篇博客

输出效果图:(没有进行美化)



先在根目录下建立demo.phppage.class.php两个文件(demo.php为测试文件,page.class.php为分页类文件)

在数据库中建立自己相应的表,这里以sqldb库shops表为例




<?php
  header("Content-Type:text/html;charset=utf-8");

    include "page.class.php";
    $link=mysql_connect("localhost", "root", "XXXXX");
    
    mysql_select_db("sqldb");
    $result=mysql_query("select * from shops");

    $total=mysql_num_rows($result);
    $num=5;

    $page=new Page($total, $num);

    $sql="select * from shops {$page->limit}";
    $result=mysql_query($sql);

写出数据库数据输出内容的相应的表格

<?php
    echo '<table align="center" width="1000" border="1">';
    echo '<caption><h1>'.shop.'</h1></caption>';

    while($row=mysql_fetch_assoc($result)){
        echo '<tr>';
        echo '<td>'.$row["id"].'</td>';
        echo '<td>'.$row["name"].'</td>';
        echo '<td>'.$row["price"].'</td>';
        echo '<td>'.$row["num"].'</td>';
        echo '<td>'.$row["desn"].'</td>';
        echo '</tr>';
    }
demo.php的内容基本就是以上两个(主要功能是连接数据库和设置输出的表格)

</pre>接下来就是分页类的书写<p>重点就是<span style="font-size:14px; color:#cc0000"><strong>page.class.php</strong></span>这个有关分页的类,主要也就写写本人认为重要的几点</p><p>定义的几个私有变量(这个不是什么重要的,只是提示一下下面代码变量的含义)</p><p></p><pre name="code" class="php"><?php
    class Page{
        private $total;   //数据表中总记录数
        private $listRows;//每页显示行数
        private $limit;
        private $uri;
        private $pageNum;   //页数
        private $config=array('header'=>"记录","prev"=>"上一页","next"=>"下一页",
                               "first"=>"首 页","last"=>"尾 页");
自动获取和解析访问当前的URL(这是整个page.class.php的重点)

private function getUri(){

            $url=$_SERVER["REQUSET_URI"].(strpos($_SERVER["REQUEST_URI"], '?')?'':"?");
            $parse=parse_url($url);
        

            if(isset($parse["query"])){
                parse_str($parse['query'],$params);  //解析字符串
                unset($params["page"]);   //删除page
                $url=$parse['path'].'?'.http_build_query($params);   //路径加组合page


            }
            if(strstr($url, '?')){
                if(substr($url, -1)!='?')
                    $url = $url."&";
            }else{
                $url = $url.'?';
            }
            return $url;
        }

下面就对几个按钮进行操作

先要获取开始位置

//开始取得位置
        private function setLimit(){
            return "Limit ".($this->page-1)*$this->listRows.", {$this->listRows}";
        }

然后对几个按钮进行操作(首页,上一页,下一页,尾页,数字按钮,跳转按钮)

其中"首页","上一页","下一页","尾页" 的方法基本相似,以“首页”为例

private function first(){
            if($this->page==1)
                $html.='';
            else
                $html.="<a href='{$this->uri}&page=1'>{$this->config["first"]}</a>";
            return $html;

        }
数字按钮:pageList()

要考虑到点击数字时数字不会消失,显示的数字按钮不会超过实际的页数也不会是负数

 private function pageList(){
            $linkPage="";

            //保证分页数显示的数目(输出一半)
            $inum=floor($this->listNum/2);

            for($i=$inum;$i>=1;$i--){
                $page=$this->page-$i;  //当前页减1
                if($page<1)
                    continue;   //页数小于1.退出
                $linkPage.="<a href='{$this->uri}&page={$page}'>{$page}</a>";
            }


               $linkPage.="{$this->page}";   //显示当前页
            


            for($i=1;$i<=$inum;$i++){
                $page=$this->page+$i;   //当前页加i
                if($page<=$this->pageNum)  //当前页小于等于页数时输出
                    $linkPage.="<a href='{$this->uri}&page={$page}'>{$page}</a>";
                else
                    break;
            }

            return $linkPage;
        }

GO按钮跳转

也是重点的部分,主要是采用了 javascript 的知识,用 javascript 实现起来相对简单一些

注意的是:回车监听和按钮监听其实是差不多的,不过按钮监听要用的是this.previousSibling.value,为了清除上一个的值

private function goPage(){
            if($this->pageNum > 1){
            return '<input type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value >'.$this->pageNum.')
                    ?'.$this->pageNum.':this.value;location=\''.$this->uri.'&page=\'+page+\'\'}"
                      value="'.$this->page.'" style="width:25px">
                      <input type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value >'.$this->pageNum.')
                    ?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'&page=\'+page+\'\'">';

                    //previousSibling为上一个同包的值
        }

最后就是将输出分页指定格式

function fpage($display=array(0,1,2,3,4,5,6,7,8)){
            $html[0]="共有<b>{$this->total}</b>{$this->config["header"]}";
            $html[1]="每页显示<b>".($this->end()-$this->start()+1)."</b>条,本页<b>{$this->start()}-
                    {$this->end()}</b>条";
            $html[2]="<b>{$this->page}/{$this->pageNum}</b>";
            $html[3]=$this->first();
            $html[4]=$this->prev();
            $html[5]=$this->pageList();
            $html[6]=$this->next();
            $html[7]=$this->last();
            $html[8]=$this->goPage();

            $fpage="";
            foreach ($display as $index) {
                $fpage.=$html[$index];
            }
            return $fpage;

        
        }


最后放上完整的代码:

demo.php

<?php
    header("Content-Type:text/html;charset=utf-8");

    include "page.class.php";
    $link=mysql_connect("localhost", "root", "XXXXX");
    
    mysql_select_db("sqldb");
    $result=mysql_query("select * from shops");

    $total=mysql_num_rows($result);
    $num=5;

    $page=new Page($total, $num);

    $sql="select * from shops {$page->limit}";
    $result=mysql_query($sql);

    echo '<table align="center" width="1000" border="1">';
    echo '<caption><h1>'.shop.'</h1></caption>';

    while($row=mysql_fetch_assoc($result)){
        echo '<tr>';
        echo '<td>'.$row["id"].'</td>';
        echo '<td>'.$row["name"].'</td>';
        echo '<td>'.$row["price"].'</td>';
        echo '<td>'.$row["num"].'</td>';
        echo '<td>'.$row["desn"].'</td>';
        echo '</tr>';
    }

    echo '<tr><td colspan="5" align="right">'.$page->fpage(array(8,3,4,5,6,7,0,1,2)).'</td></tr>';
    echo '</table>';

page.class.php

<?php
    class Page{
        private $total;   //数据表中总记录数
        private $listRows;//每页显示行数
        private $limit;
        private $uri;
        private $pageNum;   //页数
        private $config=array('header'=>"记录","prev"=>"上一页","next"=>"下一页",
                               "first"=>"首 页","last"=>"尾 页");

        private $listNum=8;   //提供一个用户可改的长度变量

        /*
         *$total
         *$listRows
         */
        public function __construct($total, $listRows=10){
            $this->total=$total;
            $this->listRows=$listRows;
            $this->uri=$this->getUri();
            //当前页
            $this->page=!empty($_GET["page"]) ? $_GET["page"] : 1;
            $this->pageNum=ceil($this->total/$this->listRows);
            $this->limit=$this->setLimit();

            var_dump($this);

        }
        //开始取得位置
        private function setLimit(){
            return "Limit ".($this->page-1)*$this->listRows.", {$this->listRows}";
        }


        private function getUri(){

            $url=$_SERVER["REQUSET_URI"].(strpos($_SERVER["REQUEST_URI"], '?')?'':"?");
            $parse=parse_url($url);
        

            if(isset($parse["query"])){
                parse_str($parse['query'],$params);  //解析字符串
                unset($params["page"]);   //删除page
                $url=$parse['path'].'?'.http_build_query($params);   //路径加组合page


            }
            if(strstr($url, '?')){
                if(substr($url, -1)!='?')
                    $url = $url."&";
            }else{
                $url = $url.'?';
            }
            return $url;
        }

        private function __get($args){
            if($args=="limit" || $args=="page"){
                return $this->limit;
            }else{
                return null;
            }
        }

        //开始位置
        private function start(){
            if($this->total==0)
                return 0;
            else
                return ($this->page-1)*$this->listRows+1;
        }
        //结束位置
        private function end(){
            return min($this->page*$this->listRows,$this->total);
        }

        private function first(){
            if($this->page==1)
                $html.='';
            else
                $html.="<a href='{$this->uri}&page=1'>{$this->config["first"]}</a>";
            return $html;

        }
        private function prev(){
            if($this->page==1)
                $html.='';
            else
                $html.="<a href='{$this->uri}&page=".($this->page-1)."'>{$this->config["prev"]}</a>";
            return $html;
        }
        private function pageList(){
            $linkPage="";

            //保证分页数显示的数目(输出一半)
            $inum=floor($this->listNum/2);

            for($i=$inum;$i>=1;$i--){
                $page=$this->page-$i;  //当前页减1
                if($page<1)
                    continue;   //页数小于1.退出
                $linkPage.="<a href='{$this->uri}&page={$page}'>{$page}</a>";
            }


               $linkPage.="{$this->page}";   //显示当前页
            


            for($i=1;$i<=$inum;$i++){
                $page=$this->page+$i;   //当前页加i
                if($page<=$this->pageNum)  //当前页小于等于页数时输出
                    $linkPage.="<a href='{$this->uri}&page={$page}'>{$page}</a>";
                else
                    break;
            }

            return $linkPage;
        }
        private function next(){
            if($this->page==$this->pageNum)
                $html.='';
            else
                $html.="<a href='{$this->uri}&page=".($this->page+1)."'>{$this->config["next"]}</a>";
            return $html;
        }
        private function last(){
            if($this->page==$this->pageNum)
                $html.='';
            else
                $html.="<a href='{$this->uri}&page=".($this->pageNum)."'>{$this->config["last"]}</a>";
            return $html;
        }
        private function goPage(){
            if($this->pageNum > 1){
            return '<input type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value >'.$this->pageNum.')
                    ?'.$this->pageNum.':this.value;location=\''.$this->uri.'&page=\'+page+\'\'}"
                      value="'.$this->page.'" style="width:25px">
                      <input type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value >'.$this->pageNum.')
                    ?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'&page=\'+page+\'\'">';

                    //previousSibling为上一个同包的值
        }
    }

        function fpage($display=array(0,1,2,3,4,5,6,7,8)){
            $html[0]="共有<b>{$this->total}</b>{$this->config["header"]}";
            $html[1]="每页显示<b>".($this->end()-$this->start()+1)."</b>条,本页<b>{$this->start()}-
                    {$this->end()}</b>条";
            $html[2]="<b>{$this->page}/{$this->pageNum}</b>";
            $html[3]=$this->first();
            $html[4]=$this->prev();
            $html[5]=$this->pageList();
            $html[6]=$this->next();
            $html[7]=$this->last();
            $html[8]=$this->goPage();

            $fpage="";
            foreach ($display as $index) {
                $fpage.=$html[$index];
            }
            return $fpage;

        
        }
    }








版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    php完美结合mysql数据库记录分页显示.pdf

    php完美结合mysql数据库记录分页显示.pdf

    PHP使用Mysqli类库实现完美分页效果的方法

    主要介绍了PHP使用Mysqli类库实现完美分页效果的方法,结合实例形式分析了PHP使用Mysqli类库的相关配置文件设置,数据库操作及分页的相关实现技巧,需要的朋友可以参考下

    自己写的一个php的分页类

    select * from tbname limit xx,xx 一直被誉为mysql最完美的分页 使用方法详见我写的说明

    Bootstrap完美分页

    自带MySQL数据库,BS框架响应式分页,值得下载

    兄弟连MySQL数据库视频教程(18集)

    教程名称:兄弟连MySQL数据库视频教程(18集)课程目录:【】1.MySQL数据库管理系统概述【】10.PHP设计完美分页类【】11.PHP的mysqli扩展库操作MySQL数据库【】12.使用PHP中mysqli扩展处理结果集【】13.使用PHP的...

    苹果CMS程序是一套采用PHP+MYSQL环境下运行的完善而强大的快速建站系统

    苹果CMS程序是一套采用PHP+MYSQL环境下运行的完善而强大的快速建站系统。 经过近多年的开发经验和技术积累,苹果CMS程序已逐步走向成熟,在易用性和功能上已经成为同行中的佼佼者。 程序体积小-&gt;优化程序代码,运行...

    MYSQL管理系统(AMS) 1.5.0107.zip

    欢迎使用 PHP MYSQL数据库管理系统-AMS-易用安全高效的MYSQL管理系统。 MYSQL管理系统(AMS) 1.5.0107 更新内容: 1、增加MySQL用户权限管理插件。 (Loc用户反馈: jumpsky) 2、提高数据查询响应速度。(CSDN用户...

    MySQL管理系统 AMS v1.5.0107

    欢迎使用 PHP MYSQL数据库管理系统 - AMS AMS-易用安全高效的MYSQL管理系统。 Amysql - AMS简介 01) 高效: 应用AMP-PHP框架与AMF-JS后台框架开发,支持同时运行多个数据库、数据表窗口、支持自定义扩展插件等。 ...

    精迅CMS v1.0 GBK PHP MYSQL 开源版.rar

    精迅CMS(Jxcms)是基于采用网络中已经成熟、稳定的技术PHP MYSQL开发而成,利用本系统您可以很方便地管理自己的网站。本系统是一款由文章模型、采集管理、广告系统、会员中心、友情链接、公告、单网页、数据备份还原...

    精迅CMS v1.0 UTF8 PHP MYSQL 开源版.rar

    精迅CMS(Jxcms)是基于采用网络中已经成熟、稳定的技术PHP MYSQL开发而成,利用本系统您可以很方便地管理自己的网站。本系统是一款由文章模型、采集管理、广告系统、会员中心、友情链接、公  告、单网页、数据备份...

    Amysql(AMS) v1.5.0107

    Amysql - AMS简介01) 高效 强大的多行SQL执行能力,支持一次执行多行SQL并多窗口完美表现各行SQL的运行结果。03) 高亮 实现版块以JS扩展形式预载,数据库列表、数据请求发送等以JSON格式传输,无刷新快速呈现。05) ...

    AMS v1.0 MySQL数据库管理系统.rar

    Amysql - AMS简介 01) 高效: 应用AMP-PHP框架与AMF-JS后台框架开发,支持同时运行多个数据库、数据表窗口、支持自定义扩展插件等。 02) 强大: 强大的多行SQL执行能力,支持一次执行多行SQL并多窗口完美表现各行SQL的...

    MySQL管理系统 AMS v1.5.0107.zip

    欢迎使用 PHP MYSQL数据库管理系统 - AMS AMS-易用安全高效的MYSQL管理系统。 Amysql - AMS简介 01) 高效: 应用AMP-PHP框架与AMF-JS后台框架开发,支持同时运行多个数据库、数据表窗口、支持自定义扩展插件等。 ...

    Amysql(AMS)官方版 v1.5.0107

    Amysql - AMS简介,高效: 应用AMP-PHP框架与AMF-JS后台框架开发,支持同时运行多个数据库、数据表窗口、支持自定义扩展插件等。强大: 强大的多行SQL执行能力,支持一次执行多行SQL并多窗口完美表现各行SQL的运行结果...

    皮皮PHP视频系统 1.0 beta2.rar

    PPVOD采用PHP MYSQL架构,国内优秀TP的框架为开发基础,其卓越的访问速度和负载能力免去您的后顾之优。本着免费开源的宗旨、将PPVOD努力打造成为您身边最贴近的建站程序! 不需要庞大的空间与高带宽;一个普通的...

    搜一次CMS电影程序 PHP版 v1.6 build 20130129.rar

    4、修复了视频分页的BUG 5、修复了用户中心注册以及其它信息展示BUG 6、修复了上版本部分后台功能的BUG &gt;&gt;程序结构优化,占用系统资源较少,经测试其PHP MYSQL数据库在动态模式可以支持日IP2万左右不卡! &gt;&gt;本...

    BIWEB WMS PHP开源企业建站系统 v5.8.5.rar

    该系统需要PHP5以上版本,并要开启PDO和PDO_MYSQL组件,否则无法使用。 BIWEB V5.8.5启用了新的底层框架,共享内存缓存的应用,是新底层的一大特色,大家可以下载来体验一下。 5.8.5更新: 1.更新了底层数据库缓存的...

    iCMSDreamArticlephp文章管理系统v3.2GBK

    iCMS 是一个采用 PHP 和 MySQL 数据库构建的高效内容管理系统,为中小型网站提供一个完美的解决方案。3.2版本实现了程序、静态、图片分离 --------------------------------------- 修复FireFox 分页代码问题 修复...

Global site tag (gtag.js) - Google Analytics