php100视频教程下载论坛用什么框架写的

全方面了解和学习PHP框架
来源:PHP100中文网&&&时间: 17:26:57&&&阅读数:
[导读] PHP成为最流行的脚本语言有许多原因:灵活性,易用性等等。对于项目开发来说,我们通常需要一个PHP框架来代替程序员完成那些重复的部分。本文将对PHP框架进行全面解析。
PHP成为最流行的脚本语言有许多原因:灵活性,易用性等等。对于项目开发来说,我们通常需要一个PHP框架来代替程序员完成那些重复的部分。本文将对PHP框架进行全面解析。
PHP框架是什么?
PHP框架提供了一个用以构建web应用的基本框架,从而简化了用PHP编写web应用程序的流程。这样不但节省开发时间,有助于建立更稳定的应用,而且减少了重复编码的开发。框架还可以帮助初学者建立更稳定的应用服务,这可以让你花更多的时间去创建实际的Web应用程序,而不是花时间写重复的代码。
我们通常认为PHP框架的作用相当于模型-视图-控制器(Model&View&Controller)。MVC是种编程的架构模式,将业务逻辑从UI中分离出来,允许一个一个单独修改。MVC打破了一个应用的开发进程,这样各组件就可以不受影响地各自工作,使得用PHP编码更快更简单。
为什么要使用PHP框架?
开发人员使用PHP框架的好处很多,其中之一是加快开发进程,为开发者节省大量的时间和精力。另外,稳定是开发者使用框架的另一个重要原因。虽然简单是PHP最大的优点,很多人也因为这一点喜欢使用这个脚本语言,但它同时也是PHP最大的缺点。一些开发者尤其是初学者很容易写出低劣的代码,而自己却没有意识到。
PHP是一个非常宽容的语言,因此,更重要的是在编程时确保没有漏洞。最后,PHP框架的使用是非常广泛的,而且有许多不同的框架可供选择。许多开发者会选择知名的框架,而且他们可以通过论坛/社区来与其他使用相同框架的开发者交流,当然你也可以开发自己的框架。在选择框架之前,你应该先问自己:它会节省你和其他使用者的时间和精力么?应用程序的性能会更好么?是否会提高稳定性?如果这些问题你的回答都是是,那么你就该为你的项目选择一个合适的框架了。
何时使用PHP框架?
这是一个无论有经验的开发者还是初级开发者都共有的问题。对于许多初学者来说,一个框架将提供很多简便和稳定,因此应该尽可能地使用PHP框架。这将有助于减少或消除不良编码,加快开发进程。另一方面,许多有经验的PHP程序员将框架视为不知道如何写出优秀的代码的低级程序员的工具。总之,当工作的项目时间紧迫时,使用PHP框架就有很多好处,可以大大加快编码进程。另一个场景是当你所做的项目有大量代码时,也应当考虑使用PHP框架,因为这将有助于减少工作的繁琐度。
最好的PHP框架有哪些?
过去的几年中,因为PHP已发展成为大多数开发者选择的脚本语言,因而也产生了大量的PHP框架。什么是最好的PHP框架,仁者见仁智者见智,因为并非每一个框架都能够适合每一个人。这里给出了一些PHP框架的评价:
◆The&Zend&Framework
Zend&Framework在开发者社区中很有人气,其重点是Web&2.0风格的应用程序。由于其广泛的支持和积极的用户群,Zend被称为PHP&Company。Zend即使不是当今最流行的PHP框架,也绝对是之一。它强大的功能能够满足企业级的需求,当然它的使用也需要具备广泛的PHP知识。
从初学者到高级PHP开发者,CakePHP都是一个很棒的选择。它与&Ruby&on&Rails设计的原则基本相同,主要集中在快速开发方面使其成为一个快速应用开发的优良框架。其迅速增长的支持系统、简单和可扩展性使CakePHP成为当今最热门的PHP框架。
Symfony针对的更多的是高级开发者,也即创建企业级应用的开发者,尤其是Askeet和Yahoo!&Bookmarks。这个开源的PHP框架功能全面,但它的主要缺点是速度慢于其他框架。
◆CodeIgniter
CodeIgniter以其易用性、性能和速度而闻名。不同于Symfony,CodeIgniter主要针对的是与人共享主机的开发者,或者为小型设备寻找PHP框架的开发者。它提供简单的解决办法,而且有一个扩展库包括视频教程、论坛、用户指南和wiki。初学者应该考虑使用CodeIgniter&。
Seagull是一个稳定的用于构建web、命令行和GUI应用的PHP框架。这是一个非常易于使用的框架,非常适合初学者到高级程序员。对于初学者,Seagull有一个范例应用库,可以自己设定后满足自身需求;对于高级开发者,Seagull提供了众多选择包括最佳实践、标准、模块化的代码基,这些都可以帮助快速简单地构建Web应用程序。Seagull有一个活跃的开发者社区,内有大量的支持性文档和说明。
以上数款PHP框架,各有特色,而且都是开源项目,不过框架针对的项目不一样,一般来说&CodeIngiter&比较适合小型项目,CakePHP&和&Zend&Framework&比较适合中型项目,Symfony&比较适合大型重量级项目,在项目选型的时候,要充分考虑框架的可以定制性、扩展性,因为每个项目都无法确定你是否会随着需求的变化进行改变。
手机扫描下方二维码,关注php100官方微信。
同步官网每日更新,为您带来随时随地的资讯与技术信息。更有不定期的互动抽奖活动,赢取实用贴心的小礼物。
除非特别声明,PHP100新闻均为原创或投稿报道,转载请注明作者及原文链接原文地址:
延伸阅读 More
视频教程 Video
网站服务:
专题合作 : tijing#(#换成@)
会员问题 :
友情链接 :
网站投稿 :
@php100官方
php100官方微信
Copyright (C) 2007-, All Rights Reserved 版权所有 京ICP备号-14
请关注php100官方微信php100全部ppt_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
评价文档:
喜欢此文档的还喜欢
php100全部ppt
所​以​最​基​本​的​P​H​P​课​件​仅​供​参​考​啊​!
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:1.84MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢完全不要用YII框架吧,这就是个垃圾。
[问题点数:40分,无满意结帖,结帖人xuzuning]
完全不要用YII框架吧,这就是个垃圾。
[问题点数:40分,无满意结帖,结帖人xuzuning]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2015年5月 PHP大版内专家分月排行榜第三2014年5月 PHP大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。当前访客身份:游客 [
:引用来自“davidzwb”的评论int fflush(FILE *st...
:int fflush(FILE *stream); DESCRIPTION For out...
:你好 ,我是一家图书公司的编辑,公司诚聘兼职作...
:+10086 感谢
:引用来自“和雨冰风”的评论 无聊呵,当时的确耗...
:引用来自“DYZ”的评论 lookup smtp.example.co...
今日访问:19
昨日访问:40
本周访问:261
本月访问:554
所有访问:11056
用ThinkPHP3.2.2框架做手机和PC端浏览器的切换
发表于9个月前( 08:57)&&
阅读(1059)&|&评论()
0人收藏此文章,
ThinkPHP搭建手机版网站:
这篇文章(肯定不是基3.2.2讲的)是在框架入口通过判断手机还是PC访问来决定app的路径,这样,我手机web和pc就不能共用MVC三层了。
-----------------------------------------------------------------------------------------------------------------
以下是在ThinkPHP官网找到的,也是网友提供的解决方案,有两种
一、TP3.2将 ismobile() 加入到{/Application/Common/function.php},TP3.1加入到{项目/Common/common.php}
function&ismobile()&{
&&&&//&如果有HTTP_X_WAP_PROFILE则一定是移动设备
&&&&if&(isset&($_SERVER['HTTP_X_WAP_PROFILE']))
&&&&&&&&return&
&&&&//此条摘自TPM智能切换模板引擎,适合TPM开发
&&&&if(isset&($_SERVER['HTTP_CLIENT'])&&&'PhoneClient'==$_SERVER['HTTP_CLIENT'])
&&&&&&&&return&
&&&&//如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
&&&&if&(isset&($_SERVER['HTTP_VIA']))
&&&&&&&&//找不到为flase,否则为true
&&&&&&&&return&stristr($_SERVER['HTTP_VIA'],&'wap')&?&true&:&
&&&&//判断手机发送的客户端标志,兼容性有待提高
&&&&if&(isset&($_SERVER['HTTP_USER_AGENT']))&{
&&&&&&&&$clientkeywords&=&array(
&&&&&&&&&&&&'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
&&&&&&&&);
&&&&&&&&//从HTTP_USER_AGENT中查找手机浏览器的关键字
&&&&&&&&if&(preg_match("/("&.&implode('|',&$clientkeywords)&.&")/i",&strtolower($_SERVER['HTTP_USER_AGENT'])))&{
&&&&&&&&&&&&return&
&&&&//协议法,因为有可能不准确,放到最后判断
&&&&if&(isset&($_SERVER['HTTP_ACCEPT']))&{
&&&&&&&&//&如果只支持wml并且不支持html那一定是移动设备
&&&&&&&&//&如果支持wml和html但是wml在html之前则是移动设备
&&&&&&&&if&((strpos($_SERVER['HTTP_ACCEPT'],&'vnd.wap.wml')&!==&false)&&&&(strpos($_SERVER['HTTP_ACCEPT'],&'text/html')&===&false&||&(strpos($_SERVER['HTTP_ACCEPT'],&'vnd.wap.wml')&&&strpos($_SERVER['HTTP_ACCEPT'],&'text/html'))))&{
&&&&&&&&&&&&return&
&&&&return&
二、TP3.2在{Application/Common/Controller/FrontendController.class.php},加入如下代码(ps:FrontendController是我的前端控制器,BaseController是我的基本控制器)
class&FrontendController&extends&BaseController&{
Public&function&_initialize(){
&&&&&&&&//移动设备浏览,则切换模板
&&&&&&&&if&(ismobile())&{
&&&&&&&&&&&&//设置默认默认主题为&Mobile
&&&&&&&&&&&&C('DEFAULT_THEME','Mobile');
&&&&&&&&//............你的更多代码.......
TP3.1在{项目/Lib/CommonAction.php},或者在你的公共控制器中加入如下代码
Class&CommonAction&extends&Action{
&&&&Public&function&_initialize(){
&&&&&&&&//移动设备浏览,则切换模板
&&&&&&&&if&(ismobile())&{
&&&&&&&&&&&&//设置默认默认主题为&Mobile
&&&&&&&&&&&&C('DEFAULT_THEME','Mobile');
&&&&&&&&//............你的更多代码.......
三、其它控制器都继承 FrontendController(TP3.2)或者CommonAction(TP3.1)这里如果没有其它特别的模板配置,在Application/Home/View文件夹里新建Mobile文件夹,放入写好的移动版 index.html文件,设置Chrome浏览器为手机UA,打开首页,此时就会自动显示手机版主页模板。:)
通过js判断,跳转到手机版域名。
&script&type="text/javascript"&
(function(a,b){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge&|maemo|midp|mmp|netfront|opera&m(ob|in)i|palm(&os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows&(ce|phone)|xda|xiino/i.test(a)||/90|3gso|4thp|50[1-6]i|770s|802s|a&wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r&|s&)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1&u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(&i|ip)|hs\-c|ht(c(\-|&|_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(&|\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(&|\/)|klon|kpt&|kwc\-|kyo(c|k)|le(no|xi)|lg(&g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|&|o|v)|zz)|mt(50|p1|v&)|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v&)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|&)|webc|whit|wi(g&|nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))window.location=b})(navigator.userAgent||navigator.vendor||window.opera,'http://填写你的wap网址');
最后我的方案
我的方案极具破坏性将会影响今后的框架升级,大致就是把上述中ismobile方法加入/ThinkPHP/Common/functions.php 中,然后在/ThinkPHP/Library/View.class.php的167用上ismobile这个方法进行判断,是手机的在view的路径上加一个前缀“m_”(view中一个内容放两个,具体如:index和m_index)
其实我只是没想好该怎么新增一个类,以及放在哪里...
补充(我的最终方案)
今天有点心不甘于是重新写了一套方案,把ThinkPHP3.2.2的帮助文档关于目构结构再看了一遍,于是想出了一套没有对原框架破坏的方案;好处就是以后框架升级没什么影响.ps:若是下版框架作很duo的改动那就没办法了。
1.目录结构如下:
我的要求是:以上两个view是公用model和controller的;
2.在Application/Home/Common/目录下新建一个function.php的文件,代码如下:
function&ismobile()&{
&&&&//&如果有HTTP_X_WAP_PROFILE则一定是移动设备
&&&&if&(isset&($_SERVER['HTTP_X_WAP_PROFILE']))
&&&&&&&&return&
&&&&//此条摘自TPM智能切换模板引擎,适合TPM开发
&&&&if(isset&($_SERVER['HTTP_CLIENT'])&&&'PhoneClient'==$_SERVER['HTTP_CLIENT'])
&&&&&&&&return&
&&&&//如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
&&&&if&(isset&($_SERVER['HTTP_VIA']))
&&&&&&&&//找不到为flase,否则为true
&&&&&&&&return&stristr($_SERVER['HTTP_VIA'],&'wap')&?&true&:&
&&&&//判断手机发送的客户端标志,兼容性有待提高
&&&&if&(isset&($_SERVER['HTTP_USER_AGENT']))&{
&&&&&&&&$clientkeywords&=&array(
&&&&&&&&&&&&'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
&&&&&&&&);
&&&&&&&&//从HTTP_USER_AGENT中查找手机浏览器的关键字
&&&&&&&&if&(preg_match("/("&.&implode('|',&$clientkeywords)&.&")/i",&strtolower($_SERVER['HTTP_USER_AGENT'])))&{
&&&&&&&&&&&&return&
&&&&//协议法,因为有可能不准确,放到最后判断
&&&&if&(isset&($_SERVER['HTTP_ACCEPT']))&{
&&&&&&&&//&如果只支持wml并且不支持html那一定是移动设备
&&&&&&&&//&如果支持wml和html但是wml在html之前则是移动设备
&&&&&&&&if&((strpos($_SERVER['HTTP_ACCEPT'],&'vnd.wap.wml')&!==&false)&&&&(strpos($_SERVER['HTTP_ACCEPT'],&'text/html')&===&false&||&(strpos($_SERVER['HTTP_ACCEPT'],&'vnd.wap.wml')&&&strpos($_SERVER['HTTP_ACCEPT'],&'text/html'))))&{
&&&&&&&&&&&&return&
&&&&return&
3控制器的处理,我是新建一个控制器类(Application/Home/Controller/HomeController.class.php)让它继承Think\Controller下的Controller公共类,然后让所有的控制去继承我这个新建的控制器
HomeController.class.php负责对手机还是PC进行判断,代码如下:
namespace&Home\C
use&Think\C
class&HomeController&extends&Controller&{
&&&&public&function&_initialize(){
&&&&&&&&if&(ismobile())&{
&&&&&&&&&&&&//设置默认默认主题为&Mobile
&&&&&&&&&&&&C('DEFAULT_V_LAYER','Mobile');
然后就是像我的index控制器(IndexController.class.php)代码如下:
namespace&Home\C
class&IndexController&extends&HomeController&{
&&&&public&function&index(){
&&&&&&&&$this-&display();
okay,it's over.
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读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_&&&&&&&&&&&&&&&&&&&&& //如果没有余数,则页数等于总数据量除以每页数的结果&& }}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[] = $&& }}else{&& $rowset = array();}// 没有包含显示结果的代码,那不在讨论范围,只要用foreach就可以很简单的用得到的二维数组来显示结果?&4、OO风格代码以下代码中的数据库连接是使用的pear db类进行处理&?php// FileName: Pager.class.php// 分页类,这个类仅仅用于处理数据结构,不负责处理显示的工作Class Pager{&& var $PageS&&&&&&&&&&&& //每页的数量&& var $CurrentPageID;&&&&&&& //当前的页数&& var $NextPageID;&&&&&&&&&& //下一页&& var $PreviousPageID;&&&&&& //上一页&& var $numP&&&&&&&&&&&& //总页数&& var $numI&&&&&&&&&&&& //总记录数&& var $isFirstP&&&&&&&&& //是否第一页&& var $isLastP&&&&&&&&&& //是否最后一页&& var $&&&&&&&&&&&&&&&&& //sql查询语句&&&& function Pager($option)&& {&&&&&& global $&&&&&& $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-&PageS&&&&&&&&&& }&&&&&& }&&&&&& else&&&&&& {&&&&&&&&&& $this-&numPages = 0;&&&&&& }&&&&&&&&&&&&& switch ( $this-&CurrentPageID )&&&&&& {&&&&&&&&&& case $this-&numPages == 1:&&&&&&&&&&&&&& $this-&isFirstPage =&&&&&&&&&&&&&& $this-&isLastPage =&&&&&&&&&&&&&&&&&&&&&&&& case 1:&&&&&&&&&&&&&& $this-&isFirstPage =&&&&&&&&&&&&&& $this-&isLastPage =&&&&&&&&&&&&&&&&&&&&&&&& case $this-&numPages:&&&&&&&&&&&&&& $this-&isFirstPage =&&&&&&&&&&&&&& $this-&isLastPage =&&&&&&&&&&&&&&&&&&&&&&&& default:&&&&&&&&&&&&&& $this-&isFirstPage =&&&&&&&&&&&&&& $this-&isLastPage =&&&&&& }&&&&&&&&&&&&& if ( $this-&numPages & 1 )&&&&&& {&&&&&&&&&& if ( !$this-&isLastPage ) { $this-&NextPageID = $this-&CurrentPageID + 1; }&&&&&&&&&& if ( !$this-&isFirstPage ) { $this-&PreviousPageID = $this-&CurrentPageID - 1; }&&&&&& }&&&&&&&&&&&&&&& }&&&&& /***&&& *&&& * 返回结果集的数据库连接&&& * 在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小&&& * 如果结果集不是很大,可以直接使用getPageData的方式获取二维数组格式的结果&&& * getPageData方法也是调用本方法来获取结果的&&& *&&& ***/&&&&& function getDataLink()&& {&&&&&& if ( $this-&numItems )&&&&&& {&&&&&&&&&& global $&&&&&&&&&&&&&&&&&&&&& $PageID = $this-&CurrentPageID;&&&&&&&&&&&&&&&&&&&&& $from = ($PageID - 1)*$this-&PageS&&&&&&&&&& $count = $this-&PageS&&&&&&&&&& $link = $db-&limitQuery($this-&sql, $from, $count);&& //使用Pear DB::limitQuery方法保证数据库兼容性&&&&&&&&&&&&&&&&&&&&& return $&&&&&& }&&&&&& else&&&&&& {&&&&&&&&&&&&&&&& }&& }&&&&& /***&&& *&&& * 以二维数组的格式返回结果集&&& *&&& ***/&&&&& function getPageData()&& {&&&&&& if ( $this-&numItems )&&&&&& {&&&&&&&&&& if ( $res = $this-&getDataLink() )&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&& if ( $res-&numRows() )&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&& while ( $row = $res-&fetchRow() )&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&& $result[] = $&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&& }&&&&&&&&&&&&&& else&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&& $result = array();&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&& return $&&&&&&&&&& }&&&&&&&&&& else&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&& }&&&&&& else&&&&&& {&&&&&&&&&&&&&&&& }&& }&&&&& 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 = $&&&&&&&&&& }&&&&&& }&&&&&&&&&&&&&&& }}?&&?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类继承一个自己的子类来显示不同的分页,比如显示用户分页列表可以:&?phpClass MemberPager extends Pager{&& function showMemberList()&& {&&&&&& global $&&&&&&&&&&&&& $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, rowspgsql: select * from table limit m offset n......所以要在类里边获取结果的时候需要使用pear db类的limitQuery方法。ok,写完收功,希望花时间看完这些文字的你不觉得是浪费了时间。&
阅读(...) 评论()}

我要回帖

更多关于 php100.com 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信