资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,学习目标,MVC,设计思想简介,了解国内外主流,PHP MVC,开源框架简介,掌握,thinkPHP,框架简介及使用流程,(,第一个,hello world),掌握,thinkPHP,中,URL路径访问和控制器之间的关系,掌握,thinkPHP,的,模板替换与系统常量,了解,thinkPHP,的调试方式的使用,掌握,thinkPHP,的,数据库及,CURD,操作,综合案例:用户注册登录流程,掌握,thinkPHP,的验证码及分页实现方式,掌握,thinkPHP,的多语言及多模版支持,掌握,thinkPHP,的,缓存管理方式,掌握,thinkPHP,的,RBAC(,基于角色的权限控制,),了解,thinkPHP,的模版技术,(view,层,smarty),项目实战:,CMS,内容管理系统(学生学籍管理),MVC简介,MVC,是一种软件设计典范能被用于组织代码用一种业务逻辑和数据显示,分离,的方法。,这个方法的假设前提是如果业务逻辑被聚集到一个部件里面,而且界面和用户围绕数据的交互能被改进和个性化定制而不需要重新编写业务逻辑,MVC,被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。,MVC(Model View Controller),模型,(model),视图,(view),控制器,(controller),。,MVC,本来是存在于,Desktop,程序中的,,M,是指数据模型,,V,是指用户界面,,C,则是控制器。使用,MVC,的目的是将,M,和,V,的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。,C,存在的目的则是确保,M,和,V,的同步,一旦,M,改变,,V,应该同步更新。,模型视图控制器(,MVC,)是,Xerox PARC,在八十年代为编程语言,Smalltalk,80,发明的一种,软件设计模式,,至今已被广泛使用。最近几年被推荐为,Oracle,旗下,Sun,公司,Java EE,平台的设计模式,并且受到越来越多的使用,ColdFusion,和,PHP,的开发者的欢迎。模型视图控制器模式是一个有用的,工具箱,,它有很多好处,但也有一些缺点(小项目不必用,mvc,是实现)。,分离好处:,1,)利于大型项目,方便后期业务逻辑的扩展,2),利于项目组成员,各个成员的分工合作,facebook -,哈佛大学的校园网,-,一个星期,MVC简介,MVC,的响应请求结构,如下图所示:,国内主流PHP mvc框架,ThinkPHP,ThinkPHP,快速、借用了成熟的,Java,思想,但是实际使用过程中有些基本的,CURD,的关联操作存在错误。,ThinkPHP,基于,PHP5,,充分利用了,PHP5,的特性。如:,ThinkPHP,的数据验证和自动填充,但是这个也束缚了,ThinkPHP,导致不考虑添加自动统计字段等小功能,.ThinkPHP,还有一个特性是从自动生成数据,但是这个却不支持关联。,ThinkPHP,有着十分优秀的特性和思想,却有着较一般的应用实践体验。,ThinkPHP,的文档号称最丰富,事实也是这样,但是,ThinkPHP,的文档和示例却又太泛泛,比如表关联只介绍了其在,model,里面的定义,其他的,CURD,操作都没有提及。,国内主流PHP mvc框架,FleaPHPFleaPHP,是一个采用,PHP,开发(完全支持,PHP4,和,PHP5,)的应用程序框架,为开发者创建自己的应用程序提供了必要的基础功能和辅助组件。它成熟、快速、功能丰富。但在一些细节上不如,ThinkPHP,人性化,如,url,函数。而且数据库的操作上这种参数的安排也是没有,ThinkPHP,人性化。,FleaPHP,对数据的操作很强大,居然可以操作中间表。,FleaPHP,的文档和示例极少,学习成本大,。但是一上手之后就很简单了。,FleaPHP,框架的核心非常小,但通过灵活的配置,可以组合出各种类型的基础架构。对于简单的脚本页面,,FleaPHP,不需要载入,MVC,模式,只需 要为应用程序提供业务逻辑和数据库服务。而对于复杂的应用程序,,FleaPHP,可以完成从,MVC,模式调用、访问控制、数据验证到文件上传、图片处理等各种 各样的任务。正是因为这种出色的定制和扩展能力,,FleaPHP,真正接近了“满足从简单应用到企业开发的各种需求”这个目标。而且与许多其他框架不 同,,FleaPHP,是一个完全在实际开发中精炼出来的框架。,FleaPHP,作为一个完全国产的框架,具有完全中文化的文档、代码注释,并且在扩展功能上也注重考虑国内开发者的实际需求。因此相对于国外的各种框架,,FleaPHP,更容易被国内开发者所接受。总结:,ThinkPHP,框架是国内比较优秀的框架,功能强大,学习起来容易。其灵活设计秉承简单的理念,如果太注重效率就使用,FleaPHP,国外主流PHP mvc框架,主要参考的,PHP,框架包括:,CodeIgniter,、,CakePHP,、,ZendFramework,、,Symfony,,,Yii,。,CodeIgniter,(,CI,框架),优点:,1.,配置简单,全部的配置使用,PHP,脚本来配置,执行效率高;具有基本的路由功能,能够进行一定程度的路由;具有初步的,Layout,功能,能够制作一定程度的界面外观;数据库层封装的不错,具有基本的,MVC,功能,2.,快速简洁,代码不多,执行性能高,,,PHP,框架简单,容易上手,学习成本低,文档详细;自带了很多简单好用的,library,,,框架适合小型应用,缺点:,1.,把,Model,层简单的理解为数据库操作,2.PHP,框架略显简单,只能够满足小型应用,略微不太能够满足中型应用需要,评价:,总体来说,拿,CodeIgniter,来完成简单快速的应用还是值得,同时能够构造一定程度的,layout,,便于模板的复用,数据操作层来说封装的不错,并且,CodeIgniter,没有使用很多太复杂的设计模式,执行性能和代码可读性上都不错。至于附加的,library,也还不错,简洁高效。,CakePHP,优点:,1.CakePHP,是最类似于,RoR,的,PHP,框架,包括设计方式,数据库操作的,Active Record,方式;设计层面很优雅,没有自带多余的,library,,所有的功能都是纯粹的框架,执行效率还不错;数据库层的,hasOne,hasMany,功能很强大,对于复杂业务处理比较合适;路由功能,配置功能还不错;自动构建脚手架(,scaffold,)很强大;适合中型应用;基本实现过了,MVC,每一层;具有自动操作命令行脚本功能;,2.,文档比较全,在国内推广的比较成功,大部分都知道,CakePHP,,学习成本中等,缺点:,1.CakePHP,非常严重的问题是把,Model,理解为数据库层操作,严重影响了除了数据库之外的操作能力,2.CakePHP,的,cache,功能略显薄弱,配置功能稍嫌弱;,CakePHP,不适合大型应用,,只适合中型应用,,小型应用来说学习成本高了些,评价:,总体来说,CakePHP,框架代表了,PHP,框架很重要的一个时代和代表,并且目前发挥着很重要的作用,不少自己写的框架都模仿了,CakePHP,的方式,是个里程碑式的产品;,CakePHP,透露着,RoR,的敏捷开发方式和把数据库操作认为是唯一,Model,的设计思想,作为开发快速应用和原型是绝好的工具;同样,用来做,Web2.0,网站的开发框架,也是值得选择的。,Zend Framework,优点:,1.,官方出品,,自带了非常多的,library,,框架本身使用了很多设计模式来编写,架构上很优雅,执行效率中等;,MVC,设计中,比较简洁,具有路由功能,配置文件比较强大(能够处理,XML,和,php INI,),各种,library,很强大,是所有,PHP,框架中各种功能最全面的,包括它不仅是一个,PHP,框架,更是一个大类库(取代,PEAR,),这是它的主要特色;能够直观的支持除数据库操作之外的,Model,层(比,CodeIgniter,和,CakePHP,强),并且能够很轻易的使用,Loader,功能加载其他新增加的,Class,;,Cache,功能很强大,从前端,Cache,到后端,Cache,都支持,后端,Cache,支持,Memcache,、,APC,、,SQLite,、文件等等方式;数据库操作功能很强大,支持各种驱动(适配器),2.,文档很全,在国内社区很成熟,并且目前不少,Web 2.0,网站在使用,学习成本中等,缺点:,1.MVC,功能完成比较弱,,View,层简单实现(跟没实现一样),,无法很强大的控制前端页面,2.,没有自动化脚本,创建一个应用,包括入口文件,全部必须自己手工构建,入门成本高,3.Zend Framework,作为一个中型应用框架问题不大,,也能够勉强作为大型应用的,PHP,框架,但是作为一个很成熟的大型,PHP,框架来说,还需要一些努力,评价:,作为官方出品的框架,,Zend Framework,的野心是可以预见的,想把其他框架挤走,同时封装很多强大的类库,能够提供一站式的框架服务,并且他们的开发团队很强大,完全足够有能力开发很强大的产品出来,所以基本可以确定的是,Zend Framework,前途无量,如果花费更多的时间去完善框架。同样的,,Zend Framework,架构本身也是比较优雅的,说明,Zend,官方是有很多高手的,设计理念上比较先进,虽然有一些功能实现的不够完善,比如,View,层,自动化脚本等等,这些都有赖于未来的升级。,Symfony,优点,1.Symfony,是,PHP,框架中功能较强大的;它,完整实现了,MVC,三层,,能够满足一个项目下多个应用的需要,并且每层可以定义自己的类库,配置文件,,layout,;非常强大的命令行操作功能,包括建立项目、建立应用、建立模块、刷新缓存等等;,2.Symfony,绝对是,开发大型复杂项目,的首选,因为使用了,Symfony,,将大大节约开发成本,并且多人协作的时候,不会出现问题,在,Project,级别定义好基础,Class,以后,任何模块都能够重用,大大复用代码,缺点:,1.,数据库操作,model,采用了重量级的,propel,和,creole,,不过在我测试的版本中已经把他们移到了,addon,里,可用可不用,2.,缓存功能无法控制,每次开发调试总是缓存,需要执行,symfony cc,symfony rc,来清除和重建缓存;,3.,效率不是很高,特别是解析模板和读取配置文件的过程,花费时间不少;,4.,学习成本很高,并且国内没有成熟的社区和文档,连中文手册都没有,相应的要掌握所有功能,需要花费比较多的时间,评价:,Symfony,绝对是企业级的,PHP,框架,唯一能够貌似能够跟,Java,领域哪些强悍框架抗衡的东西;强悍的东西,自然学习复杂,但是相应的对项目开发也比较有帮助,自然是推荐复杂的项目使用,Symfony,来处理,觉得是值得,后期的维护成本比较低,复用性很强。,ThinkPHP,ThinkPHP,视频教程,:,深入浅出PHP框架Thinkphp实战开发,:,操作系统平台(,windows,linux,unix,等),2,)服务器平台,(apache,iis,ngix,等,),URL,上支持多种模式,(4,种,),,方便,SEO pathinfo /xx/xx/xx/,自动加载,动态编辑,节约系统效率,(,自动编译,编译缓存,),强大的缓存机制(,apc,db,memcache,shmop,xcache,及,file,文件缓存等),良好的加载第三方类库的功能,方便功能的扩展(复用性非常强),1.,Thinkphp,简介,M,数据表示模型类,V,模板,C,管理类调用并管理 模型类和模板,如:,127.0.0.1/index.php?m=user&a=reg,m,代表,模块,(,控制器,),,,a,代表,action,动作,(,控制器里的,方法,),index.php,称为主入口文件,(通常为单点接入方式),2.,Thinkphp,版本和目录结构,官方地址,:,A,:,alpha,内部测试版,B,:,beta,公开测试版,C,(,RC,):,开发倒计时版(即将正式版发布之前的版本),F,:正式版,(讲解以,2.0,正式完整版,为例),建议下载“带有,扩展、示例和文档,的完整包”,注:完整包中的,ThinkPHP,文件夹为框架库文件,,该只要包含了该文件夹中,ThinkPHP.php,文件,就可以使用,ThinkPHP,框架的各种功能了,(,thinkphp,的目录结构分为,:,库目录结构,+,项目目录结构,),2.,Thinkphp,版本和目录结构,以下为,库目录结构:,Common,公共的常用函数、配置及功能模块,Lang 语言文件夹,(可用于多语言支持),Lib,框架库文件夹,Think/Core 核心,类库(模型和控制等的基类),Think/Db 数据库,抽象层(用于多数据库支持),Think/Exceptionthinkphp,自带的,异常,类,Think/Templatethinkphp,的模版引擎解析类,Think/Util,实用工具等(如:,Think/Util/Cache 缓存处理,),(,org,目录是核心包中不带的内容,只有完整包才有),org/Crypt加密方式,org/Io(input/output)对目录和文件夹的处理,org/Net,网络处理相关类,org/Util 时间处理,、图像处理、,socket,、,rbac,权限处理等实用工具类,Mode 框架模式扩展,,用于扩展框架底层功能,一般不需要了解,Tpl,系统处理模版,目录(不是模板解析),Vendor 第三方类库,2.thinkphp版本和目录结构,第一个项目演示(严格区分大小写):,在,Thinkphp,文件夹外,写一个,index.php,主入口文件,内容为,2.,Thinkphp,版本和目录结构,以下为,项目目录结构:,(如:,home 文件夹,),与开发人员密切相关的是,:,Common,项目中用到的公共文件,Conf,放置项目配置文件,Lang,项目是否自行实现多语言支持,Lib/Action,-C用来放控制器,类,Lib/Model-M,用来放数据库操作类,命名规范:,U,ser,Action,.class.php,,,U,ser,Model,.class.php,且文件中的类名须和文件名相同(去除,.class.php,),ps,:可以在,Lib,目录下自行创建,Org,目录,并将库目录下的,ORG,目录下的扩展功能类文件拷到这里(当然也可以自己写扩展功能类),2.,Thinkphp,版本和目录结构,Runtime,(编译及运行时缓存等,里面的内容由,thinkphp,自动生成),包括:,Cache 缓存(,放置编译出来的模板文件(页面),),Data,放置与表相关的数据,(,数据库字段,-,过时,不推荐使用,),Logs,项目运行日志,Temp,放置文件缓存,编译缓存,+,文件缓存,+,页面缓存,+,内存缓存(解决数据库海量读的问题,-memcache,),注:,Runtime,目录下有,app.php,和,runtime.php,,这两个文件时,thinkphp,的项目编译文件,-,即编译缓存(第一次项目运行时编译产生,第二次以后就不再编译产生了,这样加快了项目的执行效率,类似于“缓存机制”),Tpl/default,模版默认,default,皮肤(一个文件夹存放一套皮肤),3.Thinkphp项目入口文件声明项说明,主入口文件index.php,中,有以下几个声明项:,(在相关文档手册中,”,架构设计,/,入口文件”中 可以找到),.chm,1,),THINK_PATH,:定义了与,thinkphp,有关的核心框架文件目录路径,2,),APP_PATH,:应用路径(项目路径),包含前台应用和后台应用,通常:我们,将前台(,index.php,)和后台项目,(admin.php),各单独放在一个文件夹,中,3,),APP_NAME,:应用名称,作用是在,thinkphp,加载时 和 在做权限管理时,,,控制前台和后台区分开,App:run(),静态,方法在,ThinkPHP/Lib/Think/Core/App.class.php,3.Thinkphp项目入口文件声明项说明,核心编译文件,(即,Runtime,目录下的文件),(可以通过,define(RUNTIME_PATH,./admin/temp);,来自定义,Runtime,的生成路径),Runtime/app.php,和,Runtime/runtime.php,1)如果提示runtime错误,,,可以开启保留空白和注释和换行,define(STRIP_RUNTIME_SPACE,false);,2),在开发过程中,若不想生成相关的核心编译文件:,define(NO_CACHE_RUNTIME,true);(,推荐,),/,将不会生成,runtime.php,文件了,app.php,通常包含以下文件:,项目配置文件(默认配置,自定义项目配置(自定义配置高于默认配置,)等),注:项目中代码有任何改动后,建议将这两个文件删除(避免,thinkphp,编译缓存),4.URL路径访问和模块控制器之间的关系,LIB,目录存放,控制器和,模型,控制器在,URL,中的访问规则是,:,127.0.0.1/testproj/,主入口文件,/,模块名,(,控制器类名,)/,动作名,(,方法名,),thinkphp,规定:,所有的主入口文件默认访问,index,控制器,且所有的控制器默认是去找,index,方法,(,动作,),以后台主入口文件,admin.php,为例:,127.0.0.1/testproj/admin.php/index/reg,注:,1),控制器类名必须是与文件名相同,(,去除,.class.php),首字母必须大 写,必须后面加上,Action,且必须要继承,Action,类,2),方法名通常须是,public(,默认,),否则,thinkphp,无法正常解析,4.URL路径访问和模块控制器之间的关系,四种路径访问模式(URL_MODEL),:,可通过,Conf/config.php目录下修改为(0,1,2,3),如:,return array(URL_MODEL=0),1)0 普通模式,:,admin.php?a=reg&m=shop,(,get,方式,m,和,a,的顺序可以换),2),1 pathinfo模式,(默认):,admin.php/模块/方法,3)2 rewrite,重写,模式,(伪静态模式):,自己可以写相关的rewrite规则,,也可以使用,thinkphp,自带的,rewrite规则,如:可将,admin.php/模块/方法,变成,:,/,模块,/,方法,4)3 兼容模式,:,index.php?s=/user/g,(,当服务器上不支持pathinfo时,,可以自动识别为兼容模式来处理,),注:,apache,配置文件,httpd.conf,可通过把,AcceptPathInfo,Off,配置项加入,中来,关闭,apache,对,pathinfo,模式的支持,4.URL路径访问和模块控制器之间的关系,关于,rewrite,重写模式(便于,SEO,,搜索引擎优化):,1,)确认,apache,的,rewrite,模块是否已经打开 (,httpd.conf,配置中),#,LoadModule rewrite_module modules/mod_rewrite.so,将,#,去掉,2,),将,AllowOverride,None,改成,All,(,httpd.conf,配置中所有处),3,)在与主入口文件相同目录下,新建一个,.htaccess,文件,(apache,的规定,),将,url,重写规则写入其中,(,url,重写规则,可参考,thinkphp,手册,-,开发指南,-,控制器,-URL,重写),注:,开启,url,重写,无论是被重写的,还是没被重写的,都能够通过原有,路径进行访问(,rewrite,模式会加大服务器性能的消耗,),5.pathinfo的两种模式与模板 view和控制器之间的关系,关于,pathinfo,的两种模式:,在,Conf/config.php,配置文件中进行配置:,1,),普通模式,(必须在前面加上,/m/,模块,/a/,动作,且顺序可改变),URL_MODEL=1,,URL_PATHINFO_MODEL=,1,如:,localhost/home/index.php/m/user/a/index,/username/xxx/,(/username/xxx,为,get,的传值,),2,),智能,识别模块和操作,模式,(默认,)-,模块和动作的顺序就不能随意修改了,URL_MODEL=1,,URL_PATHINFO_MODEL=,2,如:,localhost/home/index.php/user/index/username/xxx/,另外如设置:,URL_PATHINFO_DEPR=-,则,URL,形式为:,localhost/home/index.php/user-index-username-xxx,(不推荐),5.pathinfo的两种模式与模板和控制器之间的关系,模版,v,和控制器,c,之前的关系,模板输出,类似于,smarty($this-display(),原则(即文件结构关系):,Tpl/default/文件夹下面一个,控制器,新建一个,文件夹,/每个,方法,一个模版,文件,如:,Tpl/default/User/index,:在,UserAction,控制器的,index,方法中,$this-display(),就可以显示,Tpl/default,中,User,文件夹下的,index.html,模版文件,(,也可像,smarty,一样,通过,$this-assign(,变量名,变量值,),进行模版的传值或修改定界符等,详见,thinkphp,手册的模版指南,)$,变量名,5.pathinfo的两种模式与模板和控制器之间的关系,访问模版文件的方法(,6,种),:,1.,模板相对路径方式:,Tpl,1,)直接调用:,$this-display();,2,)同控制器中调用其他模版:,$this-display(“gg”);,3,)跨控制器调用模板:,$this-display(index:tt);,4,)跨皮肤(跨主题)调用模板:,$this-display(skinNameindex:tt);,2.,全路径输出方式(,加载档的位置全部,以主入口档定位,):,5,)相对,全路径调用模板,$this-display(./Public/ss.html);,/,普适性,(通常可以将,前后台公共的东西,放置在与主入口同目录的,Public,目录下),6,)完全全路径调用(磁盘路径),$this-display(d:/xx/yy/hh.html);-,不推荐,另外,display参数,:模板位置,编码,,文件的mime类型,如:,$this-display(./Public/ss.xml,gb2312,text/xml);,6.系统常量与模板替换,常用的系统常量定义(详见,手册8.1.1,节),_ROOT_(,跨前后台):,代表网站根目录地址(,范围最大的,具有普适性,),_APP_(,跨控制器),:,代表,当前项目的入,口文件,的地址,_URL_(,同控制器下访问不同的,action),:,代表,当前,操作所在,模块的地址,_ACTION_,:,代表当前操作方法地址,_SELF_,:,代表当前URL地址,(带有参数传递),_CURRENT_,:,代表当前模块的模板目录,ACTION_NAME,:,代表操作名称,APP_PATH,:,代表当前项目目录,APP_NAME,:,代表当前项目名称,APP_TMPL_PATH,:,代表当前项目模板目录,APP_PUBLIC_PATH,:,代表当前项目模板的公共文件目录,CACHE_PATH,:,代表当前项目缓存目录,CONFIG_PATH,:,代表项目配置文件,COMMON_PATH,:,代表项目的公共文件目录,DATA_PATH,:,项目数据文件目录,(,thinkphp会自动缓存与表相关的结构信息,),6.系统常量与模板替换,另还有一些,可供参考并使用:,HTML_PATH IS_CGI,IS_WIN LIB_PATH LOG_PATH LANG_PATH,MEMORY_LIMIT_ON MAGIC_QUOTES_GPC,TEMP_PATH TMPL_PATH,THINK_PATH THINK_VERSION,TEMPLATE_NAME TEMPLATE_PATH,VENDOR_PATH,(,扩展目录,),WEB_PUBLIC_PATH,(公共文件目录),(,请自行查看,thinkphp,手册描述以上系统常量的功能,),6.系统常量与模板替换,1.,系统常量的作用,-,模版替换,:,这些系统常量,可以写在模板当中,如:,中,action,的取值,最好,写成,_URL_/add (,即不要写死,),其,代表的意思是访问当前模块下的add方法,,要注意这种常见用法,2.,当然也可以,自定义常量,来进行模板替换,,参考手册5.4,写在home/Conf/config.php,TMPL_PARSE_STRING=array,(,_GOOGLE_=,),7.调试模式和日志处理,调试模式(开发过程中建议开启调试模式),如何开启调试模式:在配置文件,Conf/config.php,中,APP_DEBUG=true,系统默认的,调试模式的配置,:在库文件夹,thinkphp,下的,Common/debug.php,其中,DB_FIELDS_CACHE=false,表示关闭字段缓存,(开启字段缓存,将在新加字段后,不识别新的字段,因此建议开发阶段关闭字段缓存),在,ACTION,中可以自定义,TRACE,,,$this-trace(xxxxxx);,/,须为字符串,/,信息将显示在页面,trace,信息中,7.调试模式和日志处理,2.,日志处理,系统默认的,日志处理的配置:,/thinkphp/lib/think/core/log.class.php,/,里面包含了日志的各个级别,开启日志记录,(,依赖于调试模式的开启,),:,在配置文件,Conf/config.php,中,LOG_RECORD=true,LOG_RECORD_LEVEL=array(EMERG,ALERT,)/,多个级别以,隔开,日志记录方式:,默认为文件方式,记录到,/home/Runtime/Logs(,使用文件方式的日期时间格式,),8.数据库配置与连接,Thinkphp,的,数据库抽象层类,(/ThinkPHP/Lib/Think/Db/Db.class.php),,封装了,mysql mssql pgSql,sqlLite,Oracle,ibase,等数据库的抽象操作及,Pdo,的支持,我们只需要利用,thinkphp,已经抽象并封装好的,Db,类所提供的方法来进行增删改查,就可以了,数据库的连接方式,(2,种,):,1.,采用配置文件方式,(,推荐,),连接数据库,可以在配置文件,Conf/config.php,中,进行数据库的常用连接设置,如:,return array(,DB_TYPE=mysql,/数据库类型,DB_HOST=localhost,/服务器地址,DB_NAME=dbname,/数据库名,DB_USER=root,/用户名,DB_PWD=”,/密码,DB_PORT=3306,/端口,DB_PREFIX=think_,/数据库表前缀(,推荐,),设置后建表时表名须有前缀,DB_FIELDS_CACHE=true,/,启用字段缓存,(,不推荐,),),注:,Common/convention.php,thinkphp,常用的所有默认配置,8.数据库配置与连接,2.,手动连接方式中,(,控制器方法中,),可以在,控制器方法中,通过,“,dsn,数据库连接方式”,来进行数据库的,手动连接,$dsn=mysql:/username:passwordlocalhost:3306/dbname;,$db=new Db($dsn);,或,$dsn=array(,dbms=mysql,username=username,password=password,hostname=localhost,hostport=3306,database=dbname,);,$db=new Db($dsn);,8.数据库配置与连接,关于,主从数据库,(需要进行服务器的集群),/*数据库设置,配置方式,*/,在配置文件,Conf/config.php,中,如:,return array(,DB_TYPE=mysql,/数据库类型,DB_HOST=localhost,192.168.1.2,192.168.1.3,/服务器地址,,多个以,分隔,DB_NAME=dbname,/数据库名,(相同定义一个就可以了,若不同的多个用,隔开),DB_USER=,root,repuser,repuser,/用户名,DB_PWD=,test123,123456,123456,/密码,DB_PORT=3306,/端口,DB_PREFIX=think_,/数据库表前缀,DB_CHARSET=utf8,/数据库编码默认采用utf8,DB_DEPLOY_TYPE=1,/数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器),DB_RW_SEPARATE=true,/数据库读写是否分离,主从式有效读写时,,/默认第一台是用来写,其它用来读,(“,读”通常是海量的,),),注:,thinkphp,提供了,大,C(xxx),方法,来读取配置文件,Conf/config.php,中的配置项的值,如:,C(DB_HOST),可以方便的读取数据库主机信息并用到控制器的方法或模版中,9.数据库实例化模型,数据库实例化的方式(,4,种),1),直接实例化,thinkphp,自带的模型类,(,/ThinkPHP/Lib/think/Core/Model.class.php,),即,new Model(,表名,);/,这里表名,不加表前缀,如:,$user =new Model(User);/think_user,表,$list=$user-select();/,模型类的,select(),方法,模型查询所有记录,并返回一个二维数组,dump($list);/thinkphp,自带,dump,封装方法,输出,$list,的信息,也可以采用便捷方法,M(User),大M方法;等价于$user=new Model(User);,2),数据库操作扩展模型类,如:在,/home/lib/Model/ExtModel.class.php,中,Class ExtModel extends Model,public function gg().,$user=new ExtModel(user),等价于,$user=M(user,ExtModel),就可以调用通过,Model,方法以外的用户自定义模型类的方法了,如,gg(),方法,9.数据库实例化模型,3,)利用命名规则,,自定义与表名相同的模型类,(,适用于“表专属”业务逻辑,),如:在,/home/lib/Model/UserModel.class.php,中,(,这里的,UserModel,就是处理,User,表的模型,),Class UserModel extends Model,。,$user =new UserModel();/,无需传表名,也可以采用,类似,的便捷方法,D(User),大D方法;等价于$user =new UserModel();,注:,D(),方法与“,new UserModel()”,方式不同的是:,只能实例一次,9.数据库实例化模型,4,)实例化一个,空模型,(,普适性,,实例化时不指明是操作哪一张表,),如:,$user=new Model();/,或,$user=M();,$list=$user-query(“select*from,think_user,”);,dump($list);,注:,a).,该方式是类似传统,sql,方式,必须用完整的表名,不能省表前缀名,b).,增删改用,execute(),方法,查询用,query(),方法,10.CURD与连贯操作,CURD(create(add),update,read,delete,(save),先看看,thinkphp,中基本的查询方式,:,(,thinkphp,提供,3,种方式的查询,),1)find(),:,每次只查询一条记录,,返回一个,一,维数组,2)select(),:,将该表中的,所有信息读取出来,,返回一个,二,维数组,3)findAll(),:,select(),方法的别名,如:,$user=M(user);$list=$user-select();dump($list);,10.CURD与连贯操作,在模板中遍历数据:,$list,可以通过,$user-assign(alist,$list),分配到模版中,并在模版中通过,thinkphp,专用的,标签进行,select(),返回的二维数组的遍历,(,类似于,smarty,的遍历,),而,find(),返回的一维数组可直接遍历,无需用到,标签,如:,$xx,字段名,1,$xx,字段名,2,.,10.CURD与连贯操作,以,CURD,操作为例介绍,连贯操作,(,了解,),:,关于连贯操作,格式如下(请参看手册,5.3.0,),$user,-xxx-yyy-.-,(,增,add,删,delete,改,save/,查,),注:,1,)两端的位置必须固定不变,2,)中间的,xxx,yyy,等为连贯操作,(顺序可以调换),连贯操作方法名类似于,sql,语法,10.CURD与连贯操作,以下以增删改及查为例,介绍连贯操作:,1.,增删改操作,通常可以和,data(),方法结合使用:,1,),add()-,增,$a,username,=gg;/,以,字段,作为数组关联下标,$a,password,=md5(456);/,采用,md5(),将密码进行加密,$list=$user-add($a);,或,$list=$user-,data,($a)-add();,/,将数组,$a,中的数值增加进数据库(,id,自动增长时,无需指明,),或,$list=$user-add($_GET),或,$list=$user-,data,($_GET)-add();,/,将,$_GET,数组,(,如:表单,get,方式,),中的值加进数据库,(,增加操作返回的,$list,,表示增加的记录的主键,id,值,),10.CURD与连贯操作,2)delete()-,删,a)$list=$user-delete(5);,/,直接传入主键,id,b),$id=3;,$list=$user-where(,“id$id”,)-limit(2)-delete(),/,可加,where,limit,语法,c)$list=$user-where(id5)-order(id desc)-delete(),/,也可倒序等语法,(,删除操作返回的,$list,,表示受影响的行数,),10.CURD与连贯操作,3)save()-,改,$aid=4;,$a,password,=12
展开阅读全文