php mysql数据库操作分页类


Posted in PHP onJune 04, 2008
<?php 
/* 
 *    mysql数据库 分页类 
 *    @package    pagelist 
 *    @author        yytcpt(无影) 
 *    @version    2008-03-27 
 *    @copyrigth    http://www.d5s.cn/  
 */ 
/* 
 *    分页样式 
    .page{float: left;font: 11px Arial, Helvetica, sans-serif; padding:6px 0; margin: 0px 10%; margin-top: 10px;} 
    .page a, .page strong{padding: 2px 6px; border: solid 1px #ddd;    background: #fff; text-decoration: none;} 
    .page a:visited{padding: 2px 6px; border: solid 1px #ddd; background: #fff; text-decoration: none;} 
    .page .break{padding: 2px 6px; border: none; background: #fff; text-decoration: none;} 
    .page strong{padding: 2px 6px; border-color: #999; font-weight: bold; font-size: 13px; vertical-align: top; background: #fff;} 
    .page a:hover{color: #fff; background: #0063DC; border-color: #036; text-decoration: none;} 
    .page a:hover div{color: #FFF;cursor: pointer !important;cursor: hand;} 
*/ 
    class pagelist{ 
        var $page;            //分页页码 
        var $sql;            //分页sql 
        var $img_path;        //图标路径 
        var $img;            //图标名称 
        var $img_btn;        //图标地址 
        var $page_size;        //设置每页显示条数 
        var $num_btn;        //设置数字分页的显示个数 
        var $total_pages;    //一共分多少页 
        var $total_records;    //一共有多少条记录 
        var $url; 
        var $table; 
        var $new_sql;        //指定的SQL语句 
        var $db; 
        function __construct(){ 
            global $db; 
            $this->db = $db; 
            $tmp_page = intval(trim($_GET["page"])); 
            $this->page = empty($tmp_page)?1:$tmp_page; 
            $this->set_table(); 
            $this->page_size = 20; 
            $this->num_btn    = 9; 
            $this->img_path    = '/images/'; 
            $this->img        = array("ico_first.gif", "ico_front.gif", "ico_next.gif", "ico_last.gif"); 
        } 
        function set_table(){ 
            $this->table["tablename"]    = ""; 
            $this->table["id"]        = "id"; 
            $this->table["orderby"]    = $this->table["id"]; 
            $this->table["descasc"]    = "DESC"; 
            $this->table["fileds"]    = "*"; 
            $this->table["where"]    = ""; 
        } 
        function set_img(){ 
            $this->img_btn[0]    = "<img src='".$this->img_path.$this->img[0]."' alt='首页' border='0' align='absmiddle'/>"; 
            $this->img_btn[1]    = "<img src='".$this->img_path.$this->img[1]."' alt='上一页' border='0' align='absmiddle'/>"; 
            $this->img_btn[2]    = "<img src='".$this->img_path.$this->img[2]."' alt='下一页' border='0' align='absmiddle'/>"; 
            $this->img_btn[3]    = "<img src='".$this->img_path.$this->img[3]."' alt='末页' border='0' align='absmiddle'/>"; 
        } 
        function set_show_page(){ 
            $this->set_img();        //设置翻页图片路径 
            $this->set_url(); 
            $this->set_total_records(); 
            if ($this->total_records<$this->page_size){ 
                $this->total_pages = 1; 
            }else{ 
                $this->total_pages = ceil($this->total_records/$this->page_size); 
            } 
            if ($this->page>$this->total_pages){ 
                $this->page = $this->total_pages; 
            } 
        } 
        function show_first_prv(){ 
            if ($this->page==1){ 
                $str = "<strong>".$this->img_btn[0]."</strong> <strong>".$this->img_btn[1]."</strong>"; 
            }else{ 
                $str = "<a href='".$this->url."1"."'>".$this->img_btn[0]."</a> ";    //此处1为首页,page值为1 
                $str.= "<a href='".$this->url.($this->page-1)."'>".$this->img_btn[1]."</a>"; 
            } 
            return $str; 
        } 
        function show_next_last(){ 
            if ($this->page>=$this->total_pages){ 
                $str =  "<strong>".$this->img_btn[2]."</strong> <strong>".$this->img_btn[3]."</strong>"; 
            }else{ 
                $str = "<a href='".$this->url.($this->page+1)."'>".$this->img_btn[2]."</a> "; 
                $str.= "<a href='".$this->url.$this->total_pages."'>".$this->img_btn[3]."</a>"; 
            } 
            return $str; 
        } 
        function show_num_text(){ 
            $str = " 转到第 <input id='go_num_text' type='text' value='".$this->page."' style='border:0;border-bottom:1px solid #CCC;text-align:center;width:20px;'/> 页 "; 
            $str.= "<a href='#' onClick=\"window.location='".$this->url."'+document.getElementById('go_num_text').value;\" style='font-family: Arial, Helvetica, sans-serif;font-weight:bold;font-size:14px;'>[Go]</a>"; 
            return $str; 
        } 
        function show_num_select(){ 
            if ($this->total_pages<50){ 
                $str = "<select onchange=\"if(this.options[this.selectedIndex].value!=''){location=this.options[this.selectedIndex].value;}\">"; 
                for ($i=1; $i<=$this->total_pages; $i++){ 
                    $str.= "<option value='".$this->url.$i."' ".($this->page==$i ? " selected='selected'":"").">".$i."</option>"; 
                } 
                $str.= "</select> "; 
            }else{ 
                $str = ""; 
            } 
            return $str; 
        } 
        function show_num_btn(){ 
            if ($this->page>=1 and $this->page<=$this->total_pages){ 
                $tmp_p    = ($this->num_btn-1)/2; 
                if (($this->page - $tmp_p)<=0){ 
                    $start_p    = 1; 
                }else{ 
                    if (($this->page-$tmp_p)>$this->num_btn and ($this->page-$tmp_p)>($this->total_pages - $this->num_btn+1)){ 
                        $start_p    = $this->total_pages - $this->num_btn + 1; 
                    }else{ 
                        $start_p    = $this->page - $tmp_p; 
                    } 
                } 
                if (($this->page+$tmp_p) < $this->total_pages){ 
                    $end_p = ($this->page + $tmp_p)<$this->num_btn?$this->num_btn:($this->page + $tmp_p); 
                    if ($end_p>$this->total_pages){ 
                        $end_p = $this->total_pages; 
                    } 
                }else{ 
                    $end_p = $this->total_pages; 
                } 
            } 
            $str = ""; 
            for ($i=$start_p; $i<=$end_p; $i++){ 
                if ($i==$this->page){ 
                    $str.= " <strong>".$i."</strong> "; 
                }else{ 
                    $str.= " <a href='".$this->url.$i."'>".$i."</a> "; 
                } 
            } 
            return $str; 
        } 
        function show_page_info(){ 
            $str = " 共".$this->total_records."条/".$this->total_pages."页"; 
            return $str; 
        } 
        function show_page(){ 
            if ($this->total_records<1){ 
                $this->set_show_page(); 
            } 
            $str = $this->total_pages>1 ? $this->show_first_prv().$this->show_num_btn().$this->show_next_last().$this->show_page_info().$this->show_num_text():""; 
            return $str; 
        } 
        //总页数 
        function set_total_pages(){ 
            $this->total_pages = ceil($this->total_records/$this->page_size); 
        } 
        //总记录数 
        function set_total_records(){ 
            if ($this->total_records==0 or !isset($this->total_records)){ 
                if (empty($this->count_sql) and !empty($this->table["tablename"])){ 
                    $sql = "SELECT count(".$this->table["id"].") as count_id FROM `".$this->table["tablename"]."` ".($this->table["where"]!=""?" WHERE ".$this->table["where"]:""); 
                }else{ 
                    $sql = preg_replace("/SELECT(.*?)FROM(.*?)/i", "SELECT count(id) AS count_id FROM\\2", $this->sql); 
                } 
                $arr = $this->db->row_query_one($sql); 
                $this->total_records = $arr["count_id"]; 
            } 
        } 
        /* 
         * 根据sql返回查询数据 
         * 指定$sql时,不必指定limit 
         */ 
        function get_rows_by_sql($sql){ 
            $this->sql = $sql." LIMIT ".$this->page_size*($this->page-1).", ".$this->page_size;    //指定的SQL; 
            return $this->db->row_query($this->sql); 
        } 
        /* 
         * 最常用的分页方法,只需要传3个参数 
         * $tablename 表名, $where 查询条件, $orderby 排序字段(默认以id倒序排列) 
         */ 
        function get_rows($tablename, $where="", $orderby=""){ 
            $this->table["tablename"]    = $tablename; 
            $this->table["where"]        = $where; 
            $orderby ? $this->table["orderby"] = $orderby : ""; 
            $arr = array( 
                "page"    => $this->show_page(),            //分页代码 
                "rows"    => $this->get_rows_by_sql(),    //记录数 
                "sum"    => $this->total_records,        //总记录数 
            ); 
            return $arr; 
        } 
        /* 
         * 特殊查询,$sql_query 查询sql语句, $row_count 统计总数 
         */ 
        function get_rows_sql($sql_query, $row_count=0) { 
            $this->total_records = $row_count; 
            $arr["rows"]    = $this->get_rows_by_sql($sql_query); 
            $arr["page"]    = $this->show_page(); 
            $arr["sum"]        = $this->total_records; 
            return $arr; 
        } 
        function get_sql(){ 
            if ($this->total_records>10000) { 
                $this->sql = "SELECT ".$this->table["fileds"]." FROM `".$this->table["tablename"]."` ".($this->table["where"]!=""?" WHERE ".$this->table["where"].' AND '.$this->table["id"].'>=':' WHERE '.$this->table["id"].'>=').'(SELECT '.$this->table["id"].' FROM `'.$this->table["tablename"].'` ORDER BY '.$this->table["id"].' LIMIT '.$this->page_size*($this->page-1).', 1)'." ORDER BY ".$this->table["orderby"]." ".$this->table["descasc"]." LIMIT ".$this->page_size; 
            }else{ 
                $this->sql = "SELECT ".$this->table["fileds"]." FROM `".$this->table["tablename"]."` ".($this->table["where"]!=""?" WHERE ".$this->table["where"]:"")." ORDER BY ".$this->table["orderby"]." ".$this->table["descasc"]." LIMIT ".$this->page_size*($this->page-1).", ".$this->page_size; 
            } 
            //SELECT * FROM articles ORDER BY id DESC LIMIT 0, 20 
            //SELECT * FROM articles WHERE category_id = 123 AND id >= (SELECT id FROM articles ORDER BY id LIMIT 10000, 1) LIMIT 10 
            return $this->sql;        //SQL语句 
        } 
        function set_url(){ 
            $arr_url = array(); 
            parse_str($_SERVER["QUERY_STRING"], $arr_url); 
            unset($arr_url["page"]); 
            if (empty($arr_url)){ 
                $str = "page="; 
            }else{ 
                $str = http_build_query($arr_url)."&page="; 
            } 
            $this->url = "http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]."?".$str; 
        } 
    } 
?>

<?php  
    $db_config["hostname"]    = "127.0.0.1";    //服务器地址  
    $db_config["username"]    = "root";        //数据库用户名  
    $db_config["password"]    = "root";        //数据库密码  
    $db_config["database"]    = "wap_blueidea_com";        //数据库名称  
    $db_config["charset"]    = "utf8";  
    $config["charset"]        = "utf-8";        //网站编码      include('db.php');  
    include('pagelist.php');  
    $db    = new db();  
    $db->connect($db_config);  
    header("content-type:text/html;charset=".$config["charset"]);//设置页面编码  
    $pl = new pagelist();  
    $arr = $pl->get_rows('table_name');  
    unset($pl);  
    echo '<pre style="text-align:left">';  
    print_r($arr);  
    echo '</pre>';  
    //指定特殊 sql 时候  
    $pl = new pagelist();  
    $sql = 'SELECT * FROM `wap_article` AS a, `wap_article_info` AS b WHERE a.id=b.articleid';  
    $arr = $pl->get_rows_sql($sql);  
    unset($pl);  
    echo '<pre style="text-align:left">';  
    print_r($arr);  
    echo '</pre>';  
?> 
当表中的记录总数在 10000条以上时,使用了 子查询分页,这样效率会更高一些,数据量小的时候,直接查询更快。
PHP 相关文章推荐
通过PHP CLI实现简单的数据库实时监控调度
Jul 01 PHP
PHP教程 预定义变量
Oct 23 PHP
php四种基础算法代码实例
Oct 29 PHP
PHP中的日期加减方法示例
Aug 21 PHP
thinkphp中空模板与空模块的用法实例
Nov 26 PHP
yii2中添加验证码的实现方法
Jan 09 PHP
PHP实现多关键字加亮功能
Oct 21 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
PHP共享内存使用与信号控制实例分析
May 09 PHP
PHP中散列密码的安全性分析
Jul 26 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
Oct 11 PHP
php封装的page分页类完整实例代码
Feb 01 PHP
php mysql数据库操作类
Jun 04 #PHP
CodeIgniter php mvc框架 中国网站
May 26 #PHP
五个PHP程序员工具
May 26 #PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
May 26 #PHP
JS实现php的伪分页
May 25 #PHP
php中iconv函数使用方法
May 24 #PHP
在PHP中使用模板的方法
May 24 #PHP
You might like
一个PHP分页类的代码
2011/05/18 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
浅谈PHP的反射API
2017/02/26 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
[02:33]DOTA2亚洲邀请赛趣味视频之吐真话筒
2018/03/31 DOTA
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
在Python中使用M2Crypto模块实现AES加密的教程
2015/04/08 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
Python input函数使用实例解析
2019/11/22 Python
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
外国语学院毕业生自荐信
2013/10/28 职场文书
应届毕业生通用的自荐书范文
2014/02/07 职场文书
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
法定代表人授权委托书范文
2014/08/02 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书