Ⅰ php显示很多数据库信息,如何自动分页呢代码
PHP代码如下:
/*
Author:默默
Date :2006-12-03
*/
$page=isset($_GET['page'])?intval($_GET['page']):1; //这句就是获取page=18中的page的值,假如不存在page,那么页数就是1。
$num=10; //每页显示10条数据
$db=mysql_connect("host","name","pass"); //创建数据库连接
$select=mysql_select_db("db",$db); //选择要操作的数据库
/*
首先咱们要获取数据库中到底有多少数据,才能判断具体要分多少页,具体的公式就是
总数据数除以每页显示的条数,有余进一。
也就是说10/3=3.3333=4 有余数就要进一。
*/
$total=mysql_num_rows(mysql_query("select id from table")); //查询数据的总数,id是数据库中的一个自动赋值的字段
$pagenum=ceil($total/$num); //获得总页数
//假如传入的页数参数大于总页数,则显示错误信息
If($page>$pagenum || $page == 0){
Echo "Error : Can Not Found The page .";
Exit;
}
$offset=($page-1)*$num; //获取limit的第一个参数的值,假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10。
$info=mysql_query("select name from table limit $offset,$num"); //获取相应页数所需要显示的数据,name是数据里的一个字段
While($it=mysql_fetch_array($info)){
Echo $it['name']."
";
} //显示数据
For($i=1;$i<=$pagenum;$i++){
$show=($i!=$page)?"$i":"$i";
Echo $show." ";
}
/*显示分页信息,假如是当页则显示粗体的数字,其余的页数则为超连接,假如当前为第三页则显示如下
1 2 3 4 5 6
*/
?>
Ⅱ php应该怎样分页
我也和你一样,看了好多例子都不懂,后来看了这个,总算搞懂了。这个还算简单,是说的php mysql的分页。
正文:
在看本文之前,请确保你已掌握了PHP的一些知识以及MYSQL的查询操作基础哦。
作为一个Web程序,经常要和不计其数的数据打交道,比如会员的数据,文章数据,假如只有几十个会员那很好办,在一页显示就可以了,可是假如你的网站是几千甚至几十万会员的话,如果都在一页打开的话无论对浏览器还是观看者都是一种折磨。
相信每个学习PHP的新手都会对分页这个东西感觉很头疼,不过有了默默的这一水帖,你肯定会拍拍脑袋说,嘿,原来分页竟然如此简单?的确,现在请深呼吸一口新鲜的空气,仔细的听默默给你一点一点的分解。
假设我们要处理1000条数据,要在每页中显示10条,这样的话就会分100页来显示,咱们先看一看在mysql里提取10条信息是如何操作的。
Select * from table limit 0,10
上面是一句很简单的mysql查询语句,它的作用是从一个名叫table的表里提取10条数据,并且把所有字段的值都获得。
关键的地方就在这段“limit 0,10”,它其中的0是以0为起始点,后面的10则是显示10条数据,那么我们要以10为起始点,显示到第20条数据该怎么写呢?
可能很多大大会心直口快的说“limit 10,20”嘛!啊哦,这样可就错误了哦,正确的写法是“limit 10,10”它后面的参数并非是结束点而是要提取的数目,记住哦。
懂得了如何提取10条数据,那么提取1000条也就是做100次这种查询呀,就是说要做如下的查询:
Limit 0,10 //第一页
Limit 10,10 //第二页
Limit 20,10 //第三页
Limit 30,10 //第四页
……
看出有什么规律了吗?没错,第一个参数每翻一页就增加10,可是第二个参数是不变的。
也就是说咱们设法根据页数来改变第一个参数的值,就可以进行分页显示数据了,怎么样,原理是不是很简单?
可是要怎么设法根据页数来改变第一个参数的值呢?首先,咱们要有一个页数的值,用url的GET方式获取。
比如index.php?page=18
相信大部分的大大对这个东西不陌生吧,这种url地址可是随处可见,其中的page参数的作用就是传入要显示的页数。
咱们通过一段代码来看一看究竟是如何实现的吧:
PHP代码如下:
/*
Author:默默
Date :2006-12-03
*/
$page=isset($_GET['page'])?intval($_GET['page']):1; //这句就是获取page=18中的page的值,假如不存在page,那么页数就是1。
$num=10; //每页显示10条数据
$db=mysql_connect("host","name","pass"); //创建数据库连接
$select=mysql_select_db("db",$db); //选择要操作的数据库
/*
首先咱们要获取数据库中到底有多少数据,才能判断具体要分多少页,具体的公式就是
总数据数除以每页显示的条数,有余进一。
也就是说10/3=3.3333=4 有余数就要进一。
*/
$total=mysql_num_rows(mysql_query("select id from table")); //查询数据的总数,id是数据库中的一个自动赋值的字段
$pagenum=ceil($total/$num); //获得总页数
//假如传入的页数参数大于总页数,则显示错误信息
If($page>$pagenum || $page == 0){
Echo "Error : Can Not Found The page .";
Exit;
}
$offset=($page-1)*$num; //获取limit的第一个参数的值,假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10。
$info=mysql_query("select name from table limit $offset,$num"); //获取相应页数所需要显示的数据,name是数据里的一个字段
While($it=mysql_fetch_array($info)){
Echo $it['name']."
";
} //显示数据
For($i=1;$i<=$pagenum;$i++){
$show=($i!=$page)?"$i":"$i";
Echo $show." ";
}
/*显示分页信息,假如是当页则显示粗体的数字,其余的页数则为超连接,假如当前为第三页则显示如下
1 2 3 4 5 6
*/
?>
Ⅲ PHP+MySQL高效的分页方法,如何优化LIMIT,OFFSET进行的分页
很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏。然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题。虽然没有拿来就能用的解决办法,但了解数据库的底层或多或少有助于优化分页查询。
我们先从一个常用但性能很差的查询来看一看。
SELECT *
FROM city
ORDER BY id DESC
LIMIT 0, 15
这个查询耗时0.00sec。So,这个查询有什么问题呢?实际上,这个查询语句和参数都没有问题,因为它用到了下面表的主键,而且只读取15条记录。
CREATE TABLE city (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
city varchar(128) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
真正的问题在于offset(分页偏移量)很大的时候,像下面这样:
SELECT *
FROM city
ORDER BY id DESC
LIMIT 100000, 15;
上面的查询在有2M行记录时需要0.22sec,通过EXPLAIN查看SQL的执行计划可以发现该SQL检索了100015行,但最后只需要15行。大的分页偏移量会增加使用的数据,MySQL会将大量最终不会使用的数据加载到内存中。就算我们假设大部分网站的用户只访问前几页数据,但少量的大的分页偏移量的请求也会对整个系统造成危害。Facebook意识到了这一点,但Facebook并没有为了每秒可以处理更多的请求而去优化数据库,而是将重心放在将请求响应时间的方差变小。
对于分页请求,还有一个信息也很重要,就是总共的记录数。我们可以通过下面的查询很容易的获取总的记录数。
SELECT COUNT(*)
FROM city;
然而,上面的SQL在采用InnoDB为存储引擎时需要耗费9.28sec。一个不正确的优化是采用 SQL_CALC_FOUND_ROWS,SQL_CALC_FOUND_ROWS 可以在能够在分页查询时事先准备好符合条件的记录数,随后只要执行一句 select FOUND_ROWS(); 就能获得总记录数。但是在大多数情况下,查询语句简短并不意味着性能的提高。不幸的是,这种分页查询方式在许多主流框架中都有用到,下面看看这个语句的查询性能。
SELECT SQL_CALC_FOUND_ROWS *
FROM city
ORDER BY id DESC
LIMIT 100000, 15;
这个语句耗时20.02sec,是上一个的两倍。事实证明使用 SQL_CALC_FOUND_ROWS 做分页是很糟糕的想法。
下面来看看到底如何优化。文章分为两部分,第一部分是如何获取记录的总数目,第二部分是获取真正的记录。
高效的计算行数
如果采用的引擎是MyISAM,可以直接执行COUNT(*)去获取行数即可。相似的,在堆表中也会将行数存储到表的元信息中。但如果引擎是InnoDB情况就会复杂一些,因为InnoDB不保存表的具体行数。
我们可以将行数缓存起来,然后可以通过一个守护进程定期更新或者用户的某些操作导致缓存失效时,执行下面的语句:
SELECT COUNT(*)
FROM city
USE INDEX(PRIMARY);
获取记录
下面进入这篇文章最重要的部分,获取分页要展示的记录。上面已经说过了,大的偏移量会影响性能,所以我们要重写查询语句。为了演示,我们创建一个新的表“news”,按照时事性排序(最新发布的在最前面),实现一个高性能的分页。为了简单,我们就假设最新发布的新闻的Id也是最大的。
CREATE TABLE news(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(128) NOT NULL
) ENGINE=InnoDB;
一个比较高效的方式是基于用户展示的最后一个新闻Id。查询下一页的语句如下,需要传入当前页面展示的最后一个Id。
SELECT *
FROM news WHERE id < $last_id
ORDER BY id DESC
LIMIT $perpage
查询上一页的语句类似,只不过需要传入当前页的第一个Id,并且要逆序。
SELECT *
FROM news WHERE id > $last_id
ORDER BY id ASC
LIMIT $perpage
上面的查询方式适合实现简易的分页,即不显示具体的页数导航,只显示“上一页”和“下一页”,例如博客中页脚显示“上一页”,“下一页”的按钮。但如果要实现真正的页面导航还是很难的,下面看看另一种方式。
SELECT id
FROM (
SELECT id, ((@cnt:= @cnt + 1) + $perpage - 1) % $perpage cnt
FROM news
JOIN (SELECT @cnt:= 0)T
WHERE id < $last_id
ORDER BY id DESC
LIMIT $perpage * $buttons
)C
WHERE cnt = 0;
通过上面的语句可以为每一个分页的按钮计算出一个offset对应的id。这种方法还有一个好处。假设,网站上正在发布一片新的文章,那么所有文章的位置都会往后移一位,所以如果用户在发布文章时换页,那么他会看见一篇文章两次。如果固定了每个按钮的offset Id,这个问题就迎刃而解了。Mark Callaghan发表过一篇类似的博客,利用了组合索引和两个位置变量,但是基本思想是一致的。
如果表中的记录很少被删除、修改,还可以将记录对应的页码存储到表中,并在该列上创建合适的索引。采用这种方式,当新增一个记录的时候,需要执行下面的查询重新生成对应的页号。
SET p:= 0;
UPDATE news SET page=CEIL((p:= p + 1) / $perpage) ORDER BY id DESC;
当然,也可以新增一个专用于分页的表,可以用个后台程序来维护。
UPDATE pagination T
JOIN (
SELECT id, CEIL((p:= p + 1) / $perpage) page
FROM news
ORDER BY id
)C
ON C.id = T.id
SET T.page = C.page;
现在想获取任意一页的元素就很简单了:
SELECT *
FROM news A
JOIN pagination B ON A.id=B.ID
WHERE page=$offset;
还有另外一种与上种方法比较相似的方法来做分页,这种方式比较试用于数据集相对小,并且没有可用的索引的情况下—比如处理搜索结果时。在一个普通的服务器上执行下面的查询,当有2M条记录时,要耗费2sec左右。这种方式比较简单,创建一个用来存储所有Id的临时表即可(这也是最耗费性能的地方)。
CREATE TEMPORARY TABLE _tmp (KEY SORT(random))
SELECT id, FLOOR(RAND() * 0x8000000) random
FROM city;
ALTER TABLE _tmp ADD OFFSET INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, DROP INDEX SORT,ORDER BY random;
接下来就可以向下面一样执行分页查询了。
SELECT *
FROM _tmp
WHERE OFFSET >= $offset
ORDER BY OFFSET
LIMIT $perpage;
简单来说,对于分页的优化就是。。。避免数据量大时扫描过多的记录。
Ⅳ PHP鍒嗛〉鏄剧ず鍒朵綔璇﹁В
銆銆 鍓嶈█
銆銆鍒嗛〉鏄剧ず鏄涓绉嶉潪甯稿父瑙佺殑娴忚埚拰鏄剧ず澶ч噺鏁版嵁镄勬柟娉 灞炰簬web缂栫▼涓链甯稿勭悊镄勪簨浠朵箣涓 瀵逛簬web缂栫▼镄勮佹坠𨱒ヨ 缂栧啓杩欑崭唬镰佸疄鍦ㄦ槸鍜屽懠钖镐竴镙疯嚜铹 浣嗘槸瀵逛簬鍒濆﹁呮潵璇 甯稿父瀵硅繖涓闂棰樻懜涓嶈宪澶寸华 锲犳ょ壒鍦版挵鍐欐ゆ枃瀵硅繖涓闂棰樿繘琛岃︾粏镄勮茶В 锷涙眰璁╃湅瀹岃繖绡囨枃绔犵殑链嫔弸鍦ㄧ湅瀹屼互钖庡逛簬鍒嗛〉鏄剧ず镄勫师鐞嗗拰瀹炵幇鏂规硶链夋墍浜呜В 链鏂囬傚悎鍒濆﹁呴槄璇 镓链夌ず渚嬩唬镰佸潎浣跨敤php缂栧啓
銆銆 铡熺悊
銆銆镓璋揿垎椤垫樉绀 涔熷氨鏄灏嗘暟鎹搴扑腑镄勭粨鏋滈泦浜轰负镄勫垎鎴愪竴娈典竴娈电殑𨱒ユ樉绀 杩欓噷闇瑕佷袱涓鍒濆嬬殑鍙傛暟
銆銆姣忛〉澶氩皯𨱒¤板綍($PageSize)?
銆銆褰揿墠鏄绗鍑犻〉($CurrentPageID)?
銆銆鐜板湪鍙瑕佸啀缁欐垜涓涓缁撴灉闆 鎴戝氨鍙浠ユ樉绀烘煇娈电壒瀹氱殑缁撴灉鍑烘潵
銆銆镊充簬鍏朵粬镄勫弬鏁 姣斿 涓娄竴椤($PReviousPageID) 涓嬩竴椤($NextPageID) 镐婚〉鏁($numPages)绛夌瓑 閮藉彲浠ユ牴鎹鍓嶈竟杩椤嚑涓涓滆タ寰楀埌
銆銆浠MySQL鏁版嵁搴扑负渚 濡傛灉瑕佷粠琛ㄥ唴鎴鍙栨煇娈靛唴瀹 sql璇鍙ュ彲浠ョ敤 select * from table limit offset rows 鐪嬬湅涓嬮溃涓缁剆ql璇鍙 灏濊瘯涓涓嫔彂鐜板叾涓镄勮勭巼
銆銆鍓 𨱒¤板綍 select * from table limit
銆銆绗 镊 𨱒¤板綍 select * from table limit
銆銆绗 镊 𨱒¤板綍 select * from table limit
銆銆钬︹
銆銆杩欎竴缁剆ql璇鍙ュ叾瀹炲氨鏄褰$PageSize= 镄勬椂鍊椤彇琛ㄥ唴姣忎竴椤垫暟鎹镄剆ql璇鍙 鎴戜滑鍙浠ユ荤粨鍑鸿繖镙蜂竴涓妯℃澘
銆銆select * from table limit ($CurrentPageID ) * $PageSize $PageSize
銆銆𨰾胯繖涓妯℃澘浠e叆瀵瑰簲镄勫煎拰涓婅竟闾d竴缁剆ql璇鍙ュ圭収涓涓嬬湅鐪嬫槸涓嶆槸闾d箞锲炰簨 鎼炲畾浜嗘渶閲嶈佺殑濡备綍銮峰彇鏁版嵁镄勯梾棰树互钖 鍓╀笅镄勫氨浠呬粎鏄浼犻掑弬鏁 鏋勯犲悎阃傜殑sql璇鍙ョ劧钖庝娇鐢╬hp浠庢暟鎹搴揿唴銮峰彇鏁版嵁骞舵樉绀轰简 浠ヤ笅鎴戝皢鐢ㄥ叿浣扑唬镰佸姞浠ヨ存槑
銆銆 绠鍗曚唬镰
銆銆璇疯︾粏阒呰讳互涓嬩唬镰 镊宸辫皟璇曡繍琛屼竴娆 链濂芥妸瀹冧慨鏀逛竴娆 锷犱笂镊宸辩殑锷熻兘 姣斿傛悳绱㈢瓑绛
銆銆 <?php
銆銆// 寤虹珛鏁版嵁搴撹繛鎺
銆銆$link = mysql_connect("localhost", "mysql_user", "mysql_passWord")
銆銆or die("Could not connect: " . mysql_error());
銆銆// 銮峰彇褰揿墠椤垫暟
銆銆if( isset($_GET['page']) ){
銆銆$page = intval( $_GET['page'] );
銆銆}
銆銆else{
銆銆$page = 1;
銆銆}
銆銆// 姣忛〉鏁伴噺
銆銆$PageSize = 10;
銆銆// 銮峰彇镐绘暟鎹閲
銆銆$sql = "select count(*) as amount from table";
銆銆$result = mysql_query($sql);
銆銆$row = mysql_fetch_row($result);
銆銆$amount = $row['amount'];
銆銆// 璁扮畻镐诲叡链夊氩皯椤
銆銆if( $amount ){
銆銆if( $amount < $page_size ){ $page_count = 1; } //濡傛灉镐绘暟鎹閲忓皬浜$PageSize锛岄偅涔埚彧链変竴椤
銆銆if( $amount % $page_size ){ //鍙栨绘暟鎹閲忛櫎浠ユ疮椤垫暟镄勪綑鏁
銆銆$page_count = (int)($amount / $page_size) + 1; //濡傛灉链変綑鏁帮纴鍒欓〉鏁扮瓑浜庢绘暟鎹閲忛櫎浠ユ疮椤垫暟镄勭粨鏋滃彇鏁村啀锷犱竴
銆銆}else{
銆銆$page_count = $amount / $page_size; //濡傛灉娌℃湁浣欐暟锛屽垯椤垫暟绛変簬镐绘暟鎹閲忛櫎浠ユ疮椤垫暟镄勭粨鏋
銆銆}
銆銆}
銆銆else{
銆銆$page_count = 0;
銆銆}
銆銆// 缈婚〉阈炬帴
銆銆$page_string = ''
銆銆if( $page == 1 ){
銆銆$page_string .= '绗涓椤祙涓娄竴椤祙'
銆銆}
銆銆else{
銆銆$page_string .= '<a href=?page=1>绗涓椤</a>|<a .($page-1).'>涓娄竴椤</a>|' }
銆銆if( ($page == $page_count) || ($page_count == 0) ){
銆銆$page_string .= '涓嬩竴椤祙灏鹃〉'
銆銆}
銆銆else{
銆銆$page_string .= '<a .($page+1).'>涓嬩竴椤</a>|<a .$page_count.'>灏鹃〉</a>' }
銆銆// 銮峰彇鏁版嵁锛屼互浜岀淮鏁扮粍镙煎纺杩斿洖缁撴灉
銆銆if( $amount ){
銆銆$sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size";
銆銆$result = mysql_query($sql);
銆銆while ( $row = mysql_fetch_row($result) ){
銆銆$rowset[] = $row;
銆銆}
銆銆}else{
銆銆$rowset = array();
銆銆}
銆銆// 娌℃湁鍖呭惈鏄剧ず缁撴灉镄勪唬镰侊纴闾d笉鍦ㄨㄨ鸿寖锲达纴鍙瑕佺敤foreach灏卞彲浠ュ緢绠鍗旷殑鐢ㄥ缑鍒扮殑浜岀淮鏁扮粍𨱒ユ樉绀虹粨鏋
銆銆?>
銆銆4銆丱O椋庢牸浠g爜
銆銆浠ヤ笅浠g爜涓镄勬暟鎹搴撹繛鎺ユ槸浣跨敤镄刾ear db绫昏繘琛屽勭悊
銆銆 <?php
銆銆// FileName: Pager.class.php
銆銆// 鍒嗛〉绫伙纴杩欎釜绫讳粎浠呯敤浜庡勭悊鏁版嵁缁撴瀯锛屼笉璐熻矗澶勭悊鏄剧ず镄勫伐浣
銆銆Class Pager
銆銆{
銆銆var $PageSize; //姣忛〉镄勬暟閲
銆銆var $CurrentPageID; //褰揿墠镄勯〉鏁
銆銆var $NextPageID; //涓嬩竴椤
銆銆var $PreviousPageID; //涓娄竴椤
銆銆var $numPages; //镐婚〉鏁
銆銆var $numItems; //镐昏板綍鏁
銆銆var $isFirstPage; //鏄钖︾涓椤
銆銆var $isLastPage; //鏄钖︽渶钖庝竴椤
銆銆var $sql; //sql镆ヨ㈣鍙
銆銆function Pager($option)
銆銆{
銆銆global $db;
銆銆$this->_setOptions($option);
銆銆// 镐绘浔鏁
銆銆if ( !isset($this->numItems) )
銆銆{
銆銆$res = $db->query($this->sql);
銆銆$this->numItems = $res->numRows();
銆銆}
銆銆// 镐婚〉鏁
銆銆if ( $this->numItems > 0 )
銆銆{
銆銆if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; }
銆銆if ( $this->numItems % $this->PageSize )
銆銆{
銆銆$this->numPages= (int)($this->numItems / $this->PageSize) + 1;
銆銆}
銆銆else
銆銆{
銆銆$this->numPages = $this->numItems / $this->PageSize;
銆銆}
銆銆}
銆銆else
銆銆{
銆銆$this->numPages = 0;
銆銆}
銆銆switch ( $this->CurrentPageID )
銆銆{
銆銆case $this->numPages == 1:
銆銆$this->isFirstPage = true;
銆銆$this->isLastPage = true;
銆銆break;
銆銆case 1:
銆銆$this->isFirstPage = true;
銆銆$this->isLastPage = false;
銆銆break;
銆銆case $this->numPages:
銆銆$this->isFirstPage = false;
銆銆$this->isLastPage = true;
銆銆break;
銆銆default:
銆銆$this->isFirstPage = false;
銆銆$this->isLastPage = false;
銆銆}
銆銆if ( $this->numPages > 1 )
銆銆{
銆銆if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID + 1; }
銆銆if ( !$this->isFirstPage ) { $this->PreviousPageID = $this->CurrentPageID - 1; }
銆銆}
銆銆return true;
銆銆}
銆銆/***
銆銆*
銆銆* 杩斿洖缁撴灉闆嗙殑鏁版嵁搴撹繛鎺
銆銆* 鍦ㄧ粨鏋滈泦姣旇缉澶х殑镞跺椤彲浠ョ洿鎺ヤ娇鐢ㄨ繖涓鏂规硶銮峰缑鏁版嵁搴撹繛鎺ワ纴铹跺悗鍦ㄧ被涔嫔栭亶铡嗭纴杩欐牱寮阌杈冨皬
銆銆* 濡傛灉缁撴灉闆嗕笉鏄寰埚ぇ锛屽彲浠ョ洿鎺ヤ娇鐢╣etPageData镄勬柟寮忚幏鍙栦簩缁存暟缁勬牸寮忕殑缁撴灉
銆銆* getPageData鏂规硶涔熸槸璋幂敤链鏂规硶𨱒ヨ幏鍙栫粨鏋灭殑
銆銆*
銆銆***/
銆銆function getDataLink()
銆銆{
銆銆if ( $this->numItems )
銆銆{
銆銆global $db;
銆銆$PageID = $this->CurrentPageID;
銆銆$from = ($PageID - 1)*$this->PageSize;
銆銆$count = $this->PageSize;
銆銆$link = $db->limitQuery($this->sql, $from, $count); //浣跨敤Pear DB::limitQuery鏂规硶淇濊瘉鏁版嵁搴揿吋瀹规
銆銆return $link;
銆銆}
銆銆else
銆銆{
銆銆return false;
銆銆}
銆銆}
銆銆/***
銆銆*
銆銆* 浠ヤ簩缁存暟缁勭殑镙煎纺杩斿洖缁撴灉闆
銆銆*
銆銆***/
銆銆function getPageData()
銆銆{
銆銆if ( $this->numItems )
銆銆{
銆銆if ( $res = $this->getDataLink() )
銆銆{
銆銆if ( $res->numRows() )
銆銆{
銆銆while ( $row = $res->fetchRow() )
銆銆{
銆銆$result[] = $row;
銆銆}
銆銆}
銆銆else
銆銆{
銆銆$result = array();
銆銆}
銆銆return $result;
銆銆}
銆銆else
銆銆{
銆銆return false;
銆銆}
銆銆}
銆銆else
銆銆{
銆銆return false;
銆銆}
銆銆}
銆銆function _setOptions($option)
銆銆{
銆銆$allow_options = array(
銆銆'PageSize',
銆銆'CurrentPageID',
銆銆'sql',
銆銆'numItems'
銆銆);
銆銆foreach ( $option as $key => $value )
銆銆{
銆銆if ( in_array($key, $allow_options) && ($value != null) )
銆銆{
銆銆$this->$key = $value;
銆銆}
銆銆}
銆銆return true;
銆銆}
銆銆}
銆銆?>
銆銆 <?php
銆銆// FileName: test_pager.php
銆銆// 杩欐槸涓娈电亩鍗旷殑绀轰緥浠g爜锛屽墠杈圭渷鐣ヤ简浣跨敤pear db绫诲缓绔嬫暟鎹搴撹繛鎺ョ殑浠g爜
銆銆require "Pager.class.php";
銆銆if ( isset($_GET['page']) )
銆銆{
銆銆$page = (int)$_GET['page'];
銆銆}
銆銆else
銆銆{
銆銆$page = 1;
銆銆}
銆銆$sql = "select * from table order by id";
銆銆$pager_option = array(
銆銆"sql" => $sql,
銆銆"PageSize" => 10,
銆銆"CurrentPageID" => $page
銆銆);
銆銆if ( isset($_GET['numItems']) )
銆銆{
銆銆$pager_option['numItems'] = (int)$_GET['numItems'];
銆銆}
銆銆$pager = @new Pager($pager_option);
銆銆$data = $pager->getPageData();
銆銆if ( $pager->isFirstPage )
銆銆{
銆銆$turnover = "棣栭〉|涓娄竴椤祙";
銆銆}
銆銆else
銆銆{
銆銆$turnover = "<a ?page=1&numItems=".$pager->numItems."'>棣栭〉</a>|<a ?page=".$pager->PreviousPageID."&numItems=".$pager->numItems."'>涓娄竴椤</a>|"; }
銆銆if ( $pager->isLastPage )
銆銆{
銆銆$turnover .= "涓嬩竴椤祙灏鹃〉";
銆銆}
銆銆else
銆銆{
銆銆$turnover .="<a ?page=".$pager->NextPageID."&numItems=".$pager->numItems."'>涓嬩竴椤</a>|<a ?page=".$pager->numPages."&numItems=".$pager->numItems."'>灏鹃〉</a>"; }
銆銆?>
銆銆闇瑕佽存槑镄勫湴鏂规湁涓や釜锛
銆銆杩欎釜绫讳粎浠呭勭悊鏁版嵁锛屽苟涓嶈礋璐e勭悊鏄剧ず锛屽洜涓烘垜瑙夊缑灏嗘暟鎹镄勫勭悊鍜岀粨鏋灭殑鏄剧ず閮芥斁鍒颁竴涓绫婚噷杈瑰疄鍦ㄦ槸链変簺鍕夊己銆俆w.wINgWIT鏄剧ず镄勬椂鍊欐儏鍐靛拰瑕佹眰澶氩彉锛屼笉濡傝嚜宸辨牴鎹绫荤粰鍑虹殑缁撴灉澶勭悊锛屾洿濂界殑鏂规硶鏄镙规嵁杩欎釜Pager绫荤户镓夸竴涓镊宸辩殑瀛愮被𨱒ユ樉绀轰笉钖岀殑鍒嗛〉锛屾瘆濡傛樉绀虹敤鎴峰垎椤靛垪琛ㄥ彲浠ワ细
銆銆 <?php
銆銆Class MemberPager extends Pager
銆銆{
銆銆function showMemberList()
銆銆{
銆銆global $db;
銆銆$data = $this->getPageData();
銆銆// 鏄剧ず缁撴灉镄勪唬镰
銆銆// ......
銆銆}
銆銆}
銆銆/// 璋幂敤
銆銆if ( isset($_GET['page']) )
銆銆{
銆銆$page = (int)$_GET['page'];
銆銆}
銆銆else
銆銆{
銆銆$page = 1;
銆銆}
銆銆$sql = "select * from members order by id";
銆銆$pager_option = array(
銆銆"sql" => $sql,
銆銆"PageSize" => 10,
銆銆"CurrentPageID" => $page
銆銆);
銆銆if ( isset($_GET['numItems']) )
銆銆{
銆銆$pager_option['numItems'] = (int)$_GET['numItems'];
銆銆}
銆銆$pager = @new MemberPager($pager_option);
銆銆$pager->showMemberList();
銆銆?>
銆銆绗浜屼釜闇瑕佽存槑镄勫湴鏂瑰氨鏄涓嶅悓鏁版嵁搴撶殑鍏煎规э纴鍦ㄤ笉钖岀殑鏁版嵁搴挞噷鎴銮蜂竴娈电粨鏋灭殑鍐欐硶鏄涓崭竴镙风殑銆
銆銆mysql: select * from table limit offset, rows
銆銆pgsql: select * from table limit m offset n
銆銆......
lishixin/Article/program/PHP/201311/21304
Ⅳ 我是做php的,想实现一个分页效果,就是循环出现页码,第11页的时候。显示从11到20页
1.###page.php###
//获取page的值,假如不存在page,设置页数为1。
$page=isset($_GET['page'])?intval($_GET['page']):1;
$num=10; //设置每页显示几个数据
$total=mysql_num_rows(mysql_query("select * from XXX"));//计算所有数据总数
$pagenum=ceil($total/$num); //总数除以每页显示数,计算出页数
//假如传入的页数参数大于总页数,则显示错误信息
if($page>$pagenum || $page == 0){
echo "error";
Exit;
}
$offset=($page-1)*$num; //获取limit的第一个参数
2.###index.php####
require("page.php");//引入page.php文件
//循环显示数据库内容,倒序排列,定义每页显示多少条信息
$result = mysql_query(SELECT * FROM num order by id desc limit $offset,$num);
... ...
//循环显示分页页码开始
for($i=1;$i<=$pagenum;$i++){
$show=($i!=$page)?"<a href='tel.php?page=".$i."'>$i</a>":"<b>$i</b>";
Echo $show." ";
}
Ⅵ phpcms V9 解决内容页太长怎么手动分页
在phpcms的内容编辑器中使用分页符可实现手动分页,如下图:
使用方法:
将光标移动到要分页的位置,然后点击,会自动插入分页符[page]。另外,确保“分页方式”一项选择“手动分页”。这样,当内容在前端显示的时候会自动在此处断开分页了。
注意:
手动分页的时候插入位置要合理,主要是避免将内容中成对的html标签拆开而造成显示不正常。
phpcms后台使用教程可参考官方文档和iphpcms的教程。
Ⅶ php中的分页显示
1、前言
分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解。本文适合初学者阅读,所有示例代码均使用php编写。
2、原理
所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:
每页多少条记录($PageSize)?
当前是第几页($CurrentPageID)?
现在只要再给我一个结果集,我就可以显示某段特定的结果出来。
至于其他的参数,比如:上一页($PreviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到。
以mysql数据库为例,如果要从表内截取某段内容,sql语句可以用:select * from table limit offset, rows。看看下面一组sql语句,尝试一下发现其中的规率。
前10条记录:select * from table limit 0,10
第11至20条记录:select * from table limit 10,10
第21至30条记录:select * from table limit 20,10
……
这一组sql语句其实就是当$PageSize=10的时候取表内每一页数据的sql语句,我们可以总结出这样一个模板:
select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize
拿这个模板代入对应的值和上边那一组sql语句对照一下看看是不是那么回事。搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。以下我将用具体代码加以说明。
3、简单代码
请详细阅读以下代码,自己调试运行一次,最好把它修改一次,加上自己的功能,比如搜索等等。
<?php
// 建立数据库连接
$link = mysql_connect("localhost", "mysql_user", "mysql_password")
or die("Could not connect: " . mysql_error());
// 获取当前页数
if( isset($_GET['page']) ){
$page = intval( $_GET['page'] );
}
else{
$page = 1;
}
// 每页数量
$PageSize = 10;
// 获取总数据量
$sql = "select count(*) as amount from table";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$amount = $row['amount'];
// 记算总共有多少页
if( $amount ){
if( $amount < $page_size ){ $page_count = 1; } //如果总数据量小于$PageSize,那么只有一页
if( $amount % $page_size ){ //取总数据量除以每页数的余数
$page_count = (int)($amount / $page_size) + 1; //如果有余数,则页数等于总数据量除以每页数的结果取整再加一
}else{
$page_count = $amount / $page_size; //如果没有余数,则页数等于总数据量除以每页数的结果
}
}
else{
$page_count = 0;
}
// 翻页链接
$page_string = '';
if( $page == 1 ){
$page_string .= '第一页|上一页|';
}
else{
$page_string .= '<a href="/?page=1>";第一页</a>|<a href="/?page='."($page-1).'>上一页</a>|';
}
if( ($page == $page_count) || ($page_count == 0) ){
$page_string .= '下一页|尾页';
}
else{
$page_string .= '<a href="/?page='."($page+1).'>下一页</a>|<a href="/?page='."$page_count.'>尾页</a>';
}
// 获取数据,以二维数组格式返回结果
if( $amount ){
$sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size";
$result = mysql_query($sql);
while ( $row = mysql_fetch_row($result) ){
$rowset[] = $row;
}
}else{
$rowset = array();
}
// 没有包含显示结果的代码,那不在讨论范围,只要用foreach就可以很简单的用得到的二维数组来显示结果
?>
4、OO风格代码
以下代码中的数据库连接是使用的pear db类进行处理
<?php
// FileName: Pager.class.php
// 分页类,这个类仅仅用于处理数据结构,不负责处理显示的工作
Class Pager
{
var $PageSize; //每页的数量
var $CurrentPageID; //当前的页数
var $NextPageID; //下一页
var $PreviousPageID; //上一页
var $numPages; //总页数
var $numItems; //总记录数
var $isFirstPage; //是否第一页
var $isLastPage; //是否最后一页
var $sql; //sql查询语句
function Pager($option)
{
global $db;
$this->_setOptions($option);
// 总条数
if ( !isset($this->numItems) )
{
$res = $db->query($this->sql);
$this->numItems = $res->numRows();
}
// 总页数
if ( $this->numItems > 0 )
{
if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; }
if ( $this->numItems % $this->PageSize )
{
$this->numPages= (int)($this->numItems / $this->PageSize) + 1;
}
else
{
$this->numPages = $this->numItems / $this->PageSize;
}
}
else
{
$this->numPages = 0;
}
switch ( $this->CurrentPageID )
{
case $this->numPages == 1:
$this->isFirstPage = true;
$this->isLastPage = true;
break;
case 1:
$this->isFirstPage = true;
$this->isLastPage = false;
break;
case $this->numPages:
$this->isFirstPage = false;
$this->isLastPage = true;
break;
default:
$this->isFirstPage = false;
$this->isLastPage = false;
}
if ( $this->numPages > 1 )
{
if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID + 1; }
if ( !$this->isFirstPage ) { $this->PreviousPageID = $this->CurrentPageID - 1; }
}
return true;
}
/***
*
* 返回结果集的数据库连接
* 在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小
* 如果结果集不是很大,可以直接使用getPageData的方式获取二维数组格式的结果
* getPageData方法也是调用本方法来获取结果的
*
***/
function getDataLink()
{
if ( $this->numItems )
{
global $db;
$PageID = $this->CurrentPageID;
$from = ($PageID - 1)*$this->PageSize;
$count = $this->PageSize;
$link = $db->limitQuery($this->sql, $from, $count); //使用Pear DB::limitQuery方法保证数据库兼容性
return $link;
}
else
{
return false;
}
}
/***
*
* 以二维数组的格式返回结果集
*
***/
function getPageData()
{
if ( $this->numItems )
{
if ( $res = $this->getDataLink() )
{
if ( $res->numRows() )
{
while ( $row = $res->fetchRow() )
{
$result[] = $row;
}
}
else
{
$result = array();
}
return $result;
}
else
{
return false;
}
}
else
{
return false;
}
}
function _setOptions($option)
{
$allow_options = array(
'PageSize',
'CurrentPageID',
'sql',
'numItems'
);
foreach ( $option as $key => $value )
{
if ( in_array($key, $allow_options) && ($value != null) )
{
$this->$key = $value;
}
}
return true;
}
}
?>
<?php
// FileName: test_pager.php
// 这是一段简单的示例代码,前边省略了使用pear db类建立数据库连接的代码
require "Pager.class.php";
if ( isset($_GET['page']) )
{
$page = (int)$_GET['page'];
}
else
{
$page = 1;
}
$sql = "select * from table order by id";
$pager_option = array(
"sql" => $sql,
"PageSize" => 10,
"CurrentPageID" => $page
);
if ( isset($_GET['numItems']) )
{
$pager_option['numItems'] = (int)$_GET['numItems'];
}
$pager = @new Pager($pager_option);
$data = $pager->getPageData();
if ( $pager->isFirstPage )
{
$turnover = "首页|上一页|";
}
else
{
$turnover = "<a href='?page=1&numItems=".$pager->numItems."'>首页</a>|<a href="/?page=".$pager->PreviousPageID."&numItems=".$pager->numItems."'>上一页</a>|";
}
if ( $pager->isLastPage )
{
$turnover .= "下一页|尾页";
}
else
{
$turnover .= "<a href="/?page=".$pager->NextPageID."&numItems=".$pager->numItems."'>下一页</a>|<a href="/?page=".$pager->numPages."&numItems=".$pager->numItems."'>尾页</a>";
}
?>
需要说明的地方有两个:
这个类仅仅处理数据,并不负责处理显示,因为我觉得将数据的处理和结果的显示都放到一个类里边实在是有些勉强。显示的时候情况和要求多变,不如自己根据类给出的结果处理,更好的方法是根据这个Pager类继承一个自己的子类来显示不同的分页,比如显示用户分页列表可以:
<?php
Class MemberPager extends Pager
{
function showMemberList()
{
global $db;
$data = $this->getPageData();
// 显示结果的代码
// ......
}
}
/// 调用
if ( isset($_GET['page']) )
{
$page = (int)$_GET['page'];
}
else
{
$page = 1;
}
$sql = "select * from members order by id";
$pager_option = array(
"sql" => $sql,
"PageSize" => 10,
"CurrentPageID" => $page
);
if ( isset($_GET['numItems']) )
{
$pager_option['numItems'] = (int)$_GET['numItems'];
}
$pager = @new MemberPager($pager_option);
$pager->showMemberList();
?>
第二个需要说明的地方就是不同数据库的兼容性,在不同的数据库里截获一段结果的写法是不一样的。
mysql: select * from table limit offset, rows
pgsql: select * from table limit m offset n
......
所以要在类里边获取结果的时候需要使用pear db类的limitQuery方法。
ok,写完收功,希望花时间看完这些文字的你不觉得是浪费了时间。