Title : PHP + MYSQL 对数据库内数据实现分页显示 Author : Stangly Wrong
很多PHP的初学者,都对于WEB页面的分页显示比较困惑,其实分页显示的原理非常简单,今天又有人在QQ上问我这个问题。由于顺手写了这一小记,便于众兄弟朋友翻阅。
问题:我的数据库结构如下
Create database book_list ( id int unsigned not null auto_increment, name varchar(50) not null, author varchar(50) not null, primary key (id) )
id: 为书籍的ID言标识,主键 name:书籍名称 author:书书籍作者
本例数据表的比较简单,主要是方便于解释。
现在我们需要这样分页显示这些数据,要求:数据表中已经有 11 条记录,每页显示数据为 5 条,分多页显示。
根据要求现在分析一下,
第一页显示 0 - 4 条记录 第二页显示 5 - 9 条记录 第三页显示 10 - 14 条记录
实际上可以得出如下结论,每次都需要从 $posion 条显示,显示数为 $pageSize ,在mysql中有这样一条SQL语句:
SELECT * FROM book_list WHERE 1 LIMIT 0, 5
意思是从第 0 条记录开始,读取 5 条记录。我们可以这一语句的特点来构建我们的函数,其实每次显示时就是要确定 $posion 即可了。实现代码如下:
$pageNO = 3; //确实显示第三页 $posion = ($pageNO - 1) * $pageSize; //计算从第几条记录读取
//然后构建如下SQL语句 $sql = “SELECT * FROM book_list WHERE 1 LIMIT $posion , $pageSize”;
即可以直接读出要显示的那一页所有数据。
那么下面即给一个简化版的分页类,可以对任何的数据表进行分页显示的。以便抛砖引玉.
PHP: class Page { var $tableName ; //操作的表 var $pageSize ; //页大小, 默认为10页 var $pageNO ; //当前页码即需要显示的页号 var $pageNum ; //页数统计 var $order_field ; //排序的字段 var $order_type ; //排序的方法 //构造函数,实现附加功能 // $t 为操作的表名 function Page ( $t ) { if ( $t == '' ) { echo " Table name is incorrect ! " ; return FALSE ; } $this -> tableName = $t ; $this -> pageSize = 10 ; $this -> pageNO = 1 ; $this -> pageNum = NULL ; $this -> order_field = '1' ; $this -> order_type = 'DESC' } //设置页大小 function Set_PageSize ( $p = 10 ) { $this -> pageSize = $p ; return TRUE ; } //设置当前页码 function Set_PageNo ( $p ) { $this -> PageNo = $p ; return TRUE ; } //获得总页数 // $t 为具体的表 function Get_PageNum () { global $db ; //引用一个全局的$db操作类对象 $sql = "SELECT count(*) AS num FROM $this->tableName" ; $result = $db -> Query ( $sql ); $obj = $db -> FetchObject ( $result ); return $this -> pageNum = $obj -> num ; } //获得当前页码 function Get_PageNo () { return $this -> pageNo ; } //获得当前分页大小 function Get_PageSize () { return $this -> pageSize ; } //获得需要显示的页的起启行号 function Get_Posion () { return $posion = ( $this -> pageNO - 1 ) * $this -> pageSize ; } //读取数据表的数据 // $f 为需要读取的字段列表 // $c 为select语句的条件 // // 结果将返回到数组内 // // $data[0] = array ( // fieldname => value // . // . // . // ) // function Get_Page ( $f = '*' , $c = 1 ) { global $db //引用一个全局的$db操作类对象 //获得起启行号 $posion = $this -> Get_Posion (); $sql = "SELECT $f FROM $this->tableName WHERE $c ORDER BY $this->order_field $this->order_type LIMIT $posion , $this->pageSize" ; $result = $db -> Query ( $sql ); $data = array(); $i = 1 ; while ( $arr = $db -> FetchArray ( $result ) ) { foreach ( $arr as $key => $var ) $data [ $i ][ $key ] = $var ; $i ++; } return $data ; } }
类调用示例
PHP: $page = new Page ( 'book_list' ); //设定页大小为15页 $page -> Set_PageSize ( 15 ); //设定显示的页为第2页 $page -> Set_PageNo ( 2 ); //读取页数据 //读取书名和作者两个字段 //条件是作者一定要是stangly的所有的记录 $data = $page -> Get_Page ( "name, author" , "author='stangly'" ); echo "当前显示第" . $page -> Get_PageNo (). "页数据" ; foreach ( $data as $key => $var ) { echo "书名: $key" ; echo "作者: $var" ; }
备注:本程序没有经过详细测试,可能会存在有BUG,还望您指出一二。