ThinkPHP自学笔记
thinkphp5.1学习笔记
thinkphp5.1学习笔记tp配置技巧配置的get和settp5.1的配置在config⽬录⾥,⼀个⽂件是⼀个⼀级配置项,每个⽂件⼀⾏是⼆级配置项。
use think\facade\Config;//导⼊Config 门脸public function get(){//获取全部配置// dump(Config::get());//只获取app配置项dump(Config::get('app.'));dump(Config::pull('app'));//获取⼆级配置项dump(Config::get('app.app_debug'));dump(Config::get('app_debug'));//由于app是默认⼀级配置项,可以省略dump(Config::has('default_lang'));//检查是否有这个配置项,true/falsedump(Config::get('database.hostname'));}public function set(){//动态设置,静态设置是修改配置⽂件dump(Config::set('app_debug'));}}使⽤助⼿函数public function helper(){//助⼿函数不依赖于Config,不需要导⼊Config类//dump(config());//获取全部配置,相当于Config::get()dump(config('default_lang'));dump(config('?default_lang'));//查看是否存在,true/falsedump(config('database.hostname','localhost'));//设置,返回新的设置值localhost}traittrait ⽅法优先级⼩于⽗类,当两个trait ⽅法同名,会出错,需要如下:use Demo1 ,Demo2{Demo1::hello insteadof Demo2;Demo2::hello as Demo2hello;}容器/依赖注⼊/静态代理/请求对象容器与依赖注⼊的原理任何url的访问都是定位到控制器的,<?phpnamespace app\index\controller;class Demo1{public function d1(\app\common\B $b){//拿B做参数,当访问的d1⽅法⾃动实例化⼀个B,但是URL⾥不含参数。
thinkphp笔记2
数据库部分mysql,mssql,pgsql,sqllite,oracle,ibase,PdoConfig.php//数据库抽象层到底选择哪一个,无论选哪个数据库连接方式,都是使用thinkphp封装好的方法进行增删改查‘DB_TYPE’=>’mysql’,‘DB_HOST’=>’localhost’, //主机名‘DB_NAME’=>’User’, //库名‘DB_USER’=>’root’, //用户‘DB_PWD’=>’12345’, //密码‘DB_PORT’=>’3306’, //端口‘DB_PREFIX’=>’think_’//表前缀这个设置应该放在公共位置在另外一个页面之中定义一个配置项,然后将各个应用下的自定义(个性)配置文件组合起来return 返回去原理 a.php<?phpreturn array(‘abc’=>’中国’,‘bcd’=>’中华’,);?>b.php<?php$arr=include ‘a.php’;var_dump($arr); //这时b页面就可以?>操作:与主入口文件平级的目录新建config.inc.php<?php//写下公共配置?>分别在admin 和home 子应用下的config.php写下<?php$arr1=array(//个性配置);$arr2=include ‘./config.inc.php’;return array_merge($arr1,$arr2);?>在个性配置时:admin URL模式为‘URL_MODEL’=>0,home 的为‘URL_MODEL’=>2, //rewrite//另外thinkphp还为我们提供了其他的数据库连接方式DNS1.手动连接数据库形式$dns=’mysql://username:password@ localhost:3306/DBNAME’;用来跨库操作;$db=new Db($dsn);2.$dsn=array(‘dbms’=>’mysql’,‘DB_HOST’=>’localhost’, //主机名‘DB_NAME’=>’User’, //库名‘DB_USER’=>’root’, //用户‘DB_PWD’=>’12345’, //密码‘DB_PORT’=>’3306’, //端口‘DB_PREFIX’=>’think_’//表前缀);$db=new Db($dsn);3.自定义数据库类Model/UserModel.class.php<?phpclass UserModel extends Mode{protected $connection=array(‘dbms’=>’mysql’,‘DB_HOST’=>’localhost’, //主机名‘DB_NAME’=>’User’, //库名‘DB_USER’=>’root’, //用户‘DB_PWD’=>’12345’, //密码‘DB_PORT’=>’3306’, //端口‘DB_PREFIX’=>’think_’//表前缀);}?>主从数据库比较适合高并发高负载mysql可能以后是一个瓶颈开启数据库的分布式在公共配置文件中config.inc.php ‘DB_DEPLOY_TYPE’=>1,这时’DB_HOST’=>’localhost,192.168.0.1,192.168.0.2,……’剩下的数据库名和用户名密码最好设置成统一的或者写成上面的形式读写分离写的数据比较少而读的数据是海量的‘DB_RW_SEPARATE’=>true,此时主服务器为写服务器其他的为读服务器(数据库同步可以看数据库集群)所有的数据库配置均可以在ThinkPHP/common/convention.php 中设置自定义配置高于默认设置读取配置文件中的参数C();C(‘DB_HOST’)C(‘URL_MODEL’)C(‘DB_PREFIX’)等连接数据库之后的相关操作IndexAction.class.php如何实例化模型1.创建一个基础模型2.实例化一个系统自带的数据库操作类 2.0更加科学更加方便我们可以不用自己定义相关的数据库操作类thinkphp会自动帮我们找到这个数据库当中的表,并把表当中的相应的字段全部拿过来直接操作这个对象就是操作这张表new Model 在Model当中上传一个我们需要操作的表即可首字母大写原因因为我们命名表的时候think_user thinkphp 会按照大小写来区别你在前边有没有加下划线(1)$User=new Model(‘User’)表名为think_user_message 时$abc=new Model(‘UserMessage’) 或Model(‘User_message’)实例化对象之后就能直接使用这个模型操作类当中的方法进行相应的操作$user=new Model('User');$list=$user->select();dump($list);array(2) {[0] => array(3) {["id"] => string(1) "1"["username"] => string(4) "aaaa"["password"] => string(32) "74b87337454200d4d33f80c4663dc5e5"}[1] => array(3) {["id"] => string(1) "2"["username"] => string(4) "bbbb"["password"] => string(32) "65ba841e01d6db7733e90a5b7f9e6f80"}}对于我们来说操作数组非常方便,而用数组分配到魔板当中进行遍历显示也是非常方便的所以thinkphp默认返回一个数组对于传统模式fetch_rows ………可以不用去管遍历形成数组的过程,已经遍历好了M() $user=M(‘User’);你需要实例化一个表勇士实例化一个自己写的数据库操作类(2)CommonModel.class.php<?phpclass CommonModel extends Model{public function abc(){echo ‘aaa’;}}?>IndexAction.php$user=M(‘User’,’CommonModel’);$user->abc();相当于$user= new CommonModel(‘user’);这样可以封装一些额外的逻辑方法(3)实例化一个用户定义模型需要手动创建一个模型 user 可以针对这张表来写一个自定义模型在自动模型当中可以封装thinkphp为我们提供的一些高级功能,还可以封装一些自定义方法来实现更加复杂的业务逻辑。
thinkphp笔记3
数据库部分2实例化模型的时候一般用M(‘user’)当表名为think_user_messageM(‘userMessage’) 或M(‘UserMessage’)对应创建UserMessageModel.class.php当这个类中想操作别的表名时真正表名为think_user_message_infoprotected $tableName=’UserMessageInfo’当表前缀不是think_ 时如cms_ blog_ 等protected $trueTableName=’cms_user’;跨库操作protected $dbName=’’;获取字段磁盘当中自动创建一个文件来写入我们的表字段信息一般情况下多服务器我们一般不向本地文件系统当中写入数据一方面担心无法解决到底在那个服务器上上传数据一方面为了节约系统的I/O开销,我们可以将对应的字段写到我们的Model里面来这样的话能够提高效率的同时节约I/O开销实现更加智能的用户信息判断字段protected $fields=array(0=>’id’,1=>’username’,2=>’password’,‘_pk’=’id’,‘_autoinc’=true,);$对象->getPk(); //获取主键$对象->getDbFields(); //夺取列信息CURD//创建更新读取删除(插入)create为什么要创建?创建的功能比我们想象的多它会自动获取相关数据自动令牌验证完成自动映射自动填充自动验证(三大自动)如果开启字段缓存还会匹配字段如果不存在字段他会获取字段(create)他是一系列方法的集合他返回一个数组,如果创建失败他会返回false可不可以不用创建?进了能使用创建会给我们很大的便利,他会将我们获取到的相关数据往一个对象成员属性里加注自动令牌!?完成信息的添加,修改有的人把网站页面另存为到了本地模拟了很多组数据不停的刷新向数据库中写入他还隐藏表单当中的ID给改了不仅可以改ID 为1 还可以改ID为2的处理过程当中可以判断上级来源如果上级来源的地址等于哦我们呢网站的地址我们将其写入如果不是我网站的我就禁止其写入上级来源可以被模拟thinkphp 提供了更加先进的解决方案自动令牌向当期那的SESSION回话当中放上一个MD5加密的字符串他会见这个字符串插入到表单的</from>之前第二个地方就是表单当中有function add(){$user=new Model('user');//这个数组信息,如查你用上了自动添充等,他的返回值更多啊。
thinkphp学习笔记
thinkphp学习笔记thinkphp学习笔记MVC1、ly/index.php-Home/Lib/Action/IndexAction.class.phphttp://127.0.0.1/ly/index.php/index/showurl的4种访问方式 //重点!1.PATHINFO 模式 -- 重点http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值22.普通模式http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值23.REWRITE模式(重写模式)http://域名/项目名/模块名/方法名/键1/值1/键2/值24.兼容模式http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2常用函数配制文件1、'URL_PATHINFO_DEPR'=->'-',修改Url的分隔符2、引用入口文件中,开启/关闭后DEBUG调试模式。
关闭缓存文件define(‘APP_DEBUG’,TRUE);3、开启REWRITE模式1)修改apache配制文件,去掉REWRITE前面的逗号文件;2)修改入口文件的目录下创建.htaccessRewriteEngine on//开启重写引擎RewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]//去掉index.php 这个符号4、输出this->display()控制器文件的名称与模板文件名相同。
写一个与方法名同名的文件分配一个变量个模板this->assign(表示名,具体的值)this—>assign(‘data’,$name)前台页面的{}输出,在thinkphp中表示定界符5、修改左右定界符在配置文件中添加‘TML-L-DELIM’=>‘<{’,修改左定界符‘TML-L-DELIM’=>‘}>’,修改右定界符6、thinkphp/Home/Lib/Action/IndexAction.class.phpclass IndexAction excends Action{public function index(){$m=new Model('User');//新建一个模型类,并传如一个数据表$m=M('User');//等效于$m=new Model('User'),表名第一个字母大写$arr=$m->select();//将返回的对象调用一个select方法,并将返回的值赋值$var_dump($arr)$this->assign('data',$arr[0]['username']);//将$arr[0]['username']的值分配给data$this->assign('data',$arr);//将整个数组拿出来$this->display();//输出模板}public funcion show(){$this->display;}}thinkphp/Home/Tpl/Index/index.htmlhello <{$data}>//遍历数组//name传送过来的标示,模板遍历数组<{$vo.id}><{$/doc/9d12655846 .html,ername}><{$vo.sex}>thinkphp/Home/Conf/config.class.phpreturn array('URL_PATHINFO_DERP'=>'/',/修改YRL的分隔符/'TMPL_L_DELIM'=>'<{',//修改左定界符'TMPL_R_DELIM'=>'}>',//修改右定界符'DB_TYPY'=>'mysql',//设置数据库类型'DB_HOST'=>'localhost',//设置主机'DB_NAME'=>'myselft',//设置数据库名'DB_USER'=>'root',//设置数据库用户'DB_PWD'=>'root',//设置数据库密码'DB_PORT'=>'3306'//设置数据库访问端口'DB_PREFIX'=>'my_',//设置表前缀'DB_DSN'=>'mysql://root:@localhost:3306/mysql'//使用dsn方式配置数据库信息如果两者同时存在优选使用dsn方式)C-CREATE $m->add()U-UPDATE $m->save()R-READ $m->selectD-DELETE $m->delete()开启调试功能中的page_trace1)开启调试模式define(‘APP_DEBUG’,true)2)设置配置文件中加入配置项,开启页面trace'SHOW_PAGE_TRACE'=>TRUE。
thinkphp3.2.3学习笔记
thinkphp3.2.3学习笔记3.2框架初始的⽬录结构如下:1. 部署⽬录(或者⼦⽬录)2. ├─index.php ⼊⼝⽂件3. ├─README.md README⽂件4. ├─Application 应⽤⽬录5. ├─Public 资源⽂件⽬录6. └─ThinkPHP 框架⽬录3.2版本⾃带了⼀个完整的应⽤⽬录结构和默认的应⽤⼊⼝⽂件。
其中,Application 和Public ⽬录下⾯都是空的。
README.md⽂件仅⽤于说明,实际部署的时候可以删除。
上⾯的⽬录结构和名称是可以改变的,这取决于你的⼊⼝⽂件和配置参数。
Application⽬录默认是空的,但是第⼀次访问⼊⼝⽂件会⾃动⽣成,参考后⾯的⼊⼝⽂件部分。
其中框架⽬录ThinkPHP的结构如下:1. ├─ThinkPHP 框架系统⽬录(可以部署在⾮web⽬录下⾯)2. │├─Common 核⼼公共函数⽬录3. │├─Conf 核⼼配置⽬录4. │├─Lang 核⼼语⾔包⽬录5. │├─Library 框架类库⽬录6. ││├─Think 核⼼Think类库包⽬录7. ││├─Behavior ⾏为类库⽬录8. ││├─Org Org类库包⽬录9. ││├─Vendor 第三⽅类库⽬录10. ││├─... 更多类库⽬录11. │├─Mode 框架应⽤模式⽬录12. │├─Tpl 系统模板⽬录13. │├─LICENSE.txt 框架授权协议⽂件14. │├─logo.png 框架LOGO⽂件15. │├─README.txt 框架README⽂件16. │└─index.php 框架⼊⼝⽂件上述应⽤的⽬录结构只是默认设置,事实上,在实际部署应⽤的时候,我们建议除了应⽤⼊⼝⽂件和Public 资源⽬录外,其他⽂件都放到⾮WEB⽬录下⾯,具有更好的安全性。
⼊⼝⽂件:define('APP_PATH','./Apps/');define('DIR_SECURE_', 'default.html');//⽀持多个安全⽂件写⼊define('DIR_SECURE_', 'index.html,index.htm');//默认的安全⽂件只是写⼊⼀个空⽩字符串,如果需要写⼊其他内容,可以通过DIR_SECURE_CONTENT参数来指定define('DIR_SECURE_CONTENT', 'deney Access!');define('RUNTIME_PA TH','./Runtime/');define('APP_DEBUG',True);define('THINK_PA TH',realpath('../Think').'/');require THINK_PATH.'ThinkPHP.php';//require './ThinkPHP/ThinkPHP.php';*配置⽂件的定义格式均采⽤返回PHP数组的⽅式*惯例配置⽂件(位于ThinkPHP/Conf/convention.php)*应⽤配置⽂件调⽤所有模块之前都会⾸先加载的公共配置⽂件(默认位于Application/Common/Conf/config.php)获取已经设置的参数值:C('参数名称')设置新的值:C('参数名称','新的参数值');扩展配置可以⽀持⾃动加载额外的⾃定义配置⽂件,并且配置格式和项⽬配置⼀样。
thinkPHP学习笔记18-29
thinkPHP学习笔记18-29预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制【知识回顾】数据库模型model应用mysql数据库操作(增、删、查、改)【链接数据库配置】convertion.phpconfig.php1.在config.php里面做数据库链接配置2.新建model,并修改其trueTablename属性3.修改表前缀4.字段缓存设置tp框架执行过程中会使用到数据表中的字段信息,通过sql语句“show colums from table”,出于性能考虑,可以把字段缓存,避免每次重复执行SQL语句。
5. 可以根据当前情况对model进行个性化设置【实例化Model的三种方式】1.$goods=new 命名空间GoodModel();2.$goods=D(“模型标志”);a)$goods=D(“Goods”);b)该¥goods是父类Model的对象,单操作的数据表还是sw_goodsc)$goods=D()实例化Model对象,没有具体操作数据表,与M()方法效果一致;3.$obj=M();a)实例化父类Modelb)可以直接调用父类Model里面的属性,获得数据库相关操作c)自定义Model就是一个空壳,没必要实例化自定义modeld)$obj=M(“数据表标志”);实例化Model对象,实际操作具体的数据表D()和M()的区别前者是tp3.1.3里面对new操作的简化方法后者在使用,就是实例化Model父类两者都在函数库文件定义ThinkPHP/Common/functions.php 注意,如果没有对应的Model模型文件,也可以直接实例化model对象进行操作D(),M()都可以实例化操作一个没有具体Model模型类文件的数据表【数据查询】select() 是数据模型的一个指定方法,可以获得数据表的数据信息返回一个二维数组,是数据表的全部信息1.配置smartya)配置变量信息(1)convertion.php(2)Behavior.php(页面底部显示配置,smarty配置)(3)系统里面还有一些零散的配置信息b)在config.php 里面配置smarty实用信息模板引擎配置参数(不能直接修改,在config.php里面重写)2.具体使用(从tp引擎变成smarty引擎)a)css样式如果有{},需要使用{literal}标签禁止smarty解析b)关键字$Think变为$smarty3.tp 引擎会对关键字常量进行替换,例如:__CONTROLLER__ __MODEL__smarty引擎不会给替换,需要设置为:{$smarty.const.__CONTROLLER__}【各种查询条件设置】$obj=D(标志);创建对象$obj->select();select 字段,字段from 表名where 条件group by 字段having 条件order by 排序limit 限制条数;select %DISTINCT%%FIELD% from %TABLE%%JOIN% where %% group %% having %%order %% limit %%UNION%%COMMENT%$obj->field(字段,字段);查询制定字段$obj->table(数据表);通过具体数据表查询$obj->where(参数); 查询的限制条件$obj->group(字段); 根据分组进行查询$obj->having(参数条件);having限制条件$obj->order(“price desc/asc”);排序查询$obj->limit([偏移量,]条数);查询条数限制sql 语句里面具体的设置条件在tp框架模型里边体现为体现为具体的方法操作以上方法理论上都是父类model对应的方法父类model具体存在的方法:field(),where(),limit()还有一些方法在__call()自动调用函数里面:table(),group(),order(),having() 在__call()魔术方法里面会判断当前执行的方法是否是一个method属性的元素信息,如果存在就会执行以上多个方法是同时使用多个进行显示(并且没有顺序要求)$obj->limit(5)->field(…id,name?)->order(…pieceasc?)->table(…sw_goods?)->select();以上许多方法执行没有顺序要求,许多方法执行后都是把具体的参数赋予到Model属性option里面,最后根据option拼装sql语句。
THINKPHP学习笔记10 17
问题1:thinkPHP默认访问的模块、控制器、方法是什么?问题2:thinkPHP对模块缺失如何处理?frameset绝对路径写法thinkPHP常量写法【空操作和空控制器的使用】空操作:访问不存在的方法空控制器:访问不存在的控制器http://网址/index.php/Home/User/loginhttp://网址/index.php/Home/User/login空操作http://网址/index.php/Home/beijing/login空控制器空操作一般网站出于安全考虑,不给用户提供任何错误信息“空操作”的本质意思:一个对象(控制器)调用本身不存在的方法在OOP里面,对象调用不存在的方法,出于用户体验的考虑,我们可以使用类里面的魔术方法:function__call();普通控制器父类的位置Controller类中的__call()方法从以上代码可知,空操作有两种解决方法:1.在对应控制器里面制作一个方法,名称为“_empty”,则这个控制器的空操作都会执行该方法。
(推荐使用)2.给空操作的名称制作一个同名模板,系统会自动调用。
【空控制器】http://网址/index.php/Home/Tianjin/login空控制器:在实例化控制器对象的时候,没有找到制定的类什么时候实例化控制对象:ThinkPHP/Library/Think/App.class.php熟记文件:index.php入口文件ThinkPHP/ThinkPHP.php框架核心文件ThinkPHP/Library/Think/Think.class.php框架核心文件ThinkPHP/Library/Think/App.class.php框架应用文件App.class.php内部包括控制器对象创建,以及对象调用指定的方法呈现内容空控制器处理方案:可以制作一个控制器,名称为EmptyController.class.php在该控制器内部只需要有一个_empty()方法即可。
thinkphp学习笔记-9页word资料
-------------------ONE-----------------------------一、ThinkPHP的介绍//了解MVCM - Model 模型工作:负责数据的操作V - View 视图(模板)工作:负责前台页面显示C - Controller 控制器(模块)工作:描述功能框架二、ThinkPHP的获取//了解http://thinkphp三、ThinkPHP核心文件介绍//了解├─ThinkPHP.php 框架入口文件├─Common 框架公共文件├─Conf 框架配置文件├─Extend 框架扩展目录├─Lang 核心语言包目录├─Lib 核心类库目录│├─Behavior 核心行为类库│├─Core 核心基类库│├─Driver 内置驱动││├─Cache 内置缓存驱动││├─Db 内置数据库驱动││├─TagLib 内置标签驱动││└─Template 内置模板引擎驱动│└─Template 内置模板引擎└─Tpl 系统模板目录四、实验环境搭建//了解五、项目搭建//重点#项目目录结构及说明:Home 前台应用文件夹├─Common 项目公共文件目录├─Conf 项目配置目录├─Lang 项目语言目录├─Lib 项目类库目录│├─Action Action类库目录│├─Behavior 行为类库目录│├─Model 模型类库目录│└─Widget Widget类库目录├─Runtime 项目运行时目录│├─Cache 模板缓存目录│├─Data 数据缓存目录│├─Logs 日志文件目录│└─Temp 临时缓存目录└─Tpl 项目模板目录-------------------TWO-----------------------------一、什么是MVC //了解M -Model 编写model类对数据进行操作V -View 编写html文件,页面呈现C -Controller 编写类文件(UserAction.class.php)二、ThinkPHP的MVC特点//了解三、ThinkPHP的MVC对应的目录//了解M 项目目录/应用目录/Lib/ModelV 项目目录/应用目录/TplC 项目目录/应用目录/Lib/Action四、url访问C //了解五、url的4种访问方式//重点!1.PA THINFO 模式-- 重点!!!!!!http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值22.普通模式http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值23.REWRITE模式http://域名/项目名/模块名/方法名/键1/值1/键2/值24.兼容模式http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2-------------------THREE-----------------------------一、ThinkPHP 3 的输出(重点)a、通过echo 等PHP原生的输出方式在页面中输出b、通过display方法输出想分配变量可以使用assign方法c、修改左右定界符休要修改配置文件中的配置项'TMPL_L_DELIM'=>'<{', //修改左定界符'TMPL_R_DELIM'=>'}>', //修改右定界符二、ThinkPHP 3 的模型使用(重点)需要在方法中通过new Model(表名)的形式操作数据库$m=new Model('User');$arr=$m->select();'DB_TYPE'=>'mysql', //设置数据库类型'DB_HOST'=>'localhost',//设置主机'DB_NAME'=>'thinkphp',//设置数据库名'DB_USER'=>'root', //设置用户名'DB_PWD'=>'', //设置密码'DB_PORT'=>'3306', //设置端口号'DB_PREFIX'=>'tp_', //设置表前缀-------------------FOUR-----------------------------一、ThinkPHP 3 的输出(重点)a、通过echo 等PHP原生的输出方式在页面中输出b、通过display方法输出想分配变量可以使用assign方法c、修改左右定界符休要修改配置文件中的配置项'TMPL_L_DELIM'=>'<{', //修改左定界符'TMPL_R_DELIM'=>'}>', //修改右定界符二、ThinkPHP 3 的模型使用(重点)需要在方法中通过new Model(表名)的形式操作数据库$m=new Model('User');$arr=$m->select();'DB_TYPE'=>'mysql', //设置数据库类型'DB_HOST'=>'localhost',//设置主机'DB_NAME'=>'thinkphp',//设置数据库名'DB_USER'=>'root', //设置用户名'DB_PWD'=>'', //设置密码'DB_PORT'=>'3306', //设置端口号'DB_PREFIX'=>'tp_', //设置表前缀也可以使用DSN方法进行配置'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使用DSN方式配置数据库信息如果两种方式同时存在,以DSN方式为优先还有一种简单实用模型的方式M() 等效为new Model();$m=M('User');$arr=$m->select();使用模型的实例可以对数据进行操作,操作的工作一般就是对数据库进行增删改查CURD 增-C Create $m->add()删-D Delete $m->delete()改-U Update $m->save()查-R Read $m->select()三、补充(了解)a、模板可以遍历数组<volist name='data' id='vo'><{$vo.id}>----<{$ername}>-----<{$vo.sex}><br/></volist>b、我们可以开启调试功能中的page_trace1.开启调试功能//3.开启调试模式define('APP_DEBUG',true);2.我们需要设置配置文件,开启页面trace'SHOW_PAGE_TRACE'=>true,//开启页面Trace-------------------FIVE-----------------------------一、ThinkPHP 3 的CURD介绍(了解)二、ThinkPHP 3 读取数据(重点)对数据的读取Read$m=new Model('User');$m=M('User');select$m->select();//获取所有数据,以数组形式返回find$m->find($id);//获取单条数据getField(字段名)//获取一个具体的字段值$arr=$m->where('id=2')->getField('username');三、ThinkPHP 3 创建数据(重点)对数据的添加Create$m=new Model('User');$m=M('User');$m->字段名=值$m->add();返回值是新增的id号四、ThinkPHP 3 删除数据(重点)$m=M('User');$m->delete(2); //删除id为2的数据$m->where('id=2')->delete(); //与上面效果相同,也是删除id为2的数据返回值是受影响行数五、ThinkPHP 3 更新数据(重点)$m=M('User');$data['id']=1;$data['username']='ztz2';$m->save($data);返回值是受影响行数-------------------SIX-----------------------------一、普通查询方式a、字符串$arr=$m->where("sex=0 and username='gege'")->find();b、数组$data['sex']=0;$data['username']='gege';$arr=$m->where($data)->find();注意:这种方式默认是and的关系,如果使用or关系,需要添加数组值$data['sex']=0;$data['username']='gege';$data['_logic']='or';二、表达式查询方式$data['id']=array('lt',6);$arr=$m->where($data)->select();EQ 等于NEQ不等于GT 大于EGT大于等于LT 小于LIKE 模糊查询$data['username']=array('like','%ge');$arr=$m->where($data)->select();NOTLIKE$data['username']=array('notlike','%ge%'); //notlike中间没有空格$arr=$m->where($data)->select();注意:如果一个字段要匹配多个通配符$data['username']=array('like',array('%ge%','%2%','%五%'),'and');//如果没有第三个值,默认关系是or关系$arr=$m->where($data)->select();BETWEEN$data['id']=array('between',array(5,7));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( (`id` BETWEEN 5 AND 7 ) )$data['id']=array('not between',array(5,7));//注意,not 和between中间一定要有空格$arr=$m->where($data)->select();IN$data['id']=array('in',array(4,6,7));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( `id` IN (4,6,7) )$data['id']=array('not in',array(4,6,7));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( `id` NOT IN (4,6,7) )-------------------SEVEN----------------------------一、普通查询方式a、字符串$arr=$m->where("sex=0 and username='gege'")->find();b、数组$data['sex']=0;$data['username']='gege';$arr=$m->where($data)->find();注意:这种方式默认是and的关系,如果使用or关系,需要添加数组值$data['sex']=0;$data['username']='gege';$data['_logic']='or';二、表达式查询方式$data['id']=array('lt',6);$arr=$m->where($data)->select();EQ 等于NEQ不等于GT 大于EGT大于等于LT 小于LIKE 模糊查询$data['username']=array('like','%ge');$arr=$m->where($data)->select();NOTLIKE$data['username']=array('notlike','%ge%'); //notlike中间没有空格$arr=$m->where($data)->select();注意:如果一个字段要匹配多个通配符$data['username']=array('like',array('%ge%','%2%','%五%'),'and');//如果没有第三个值,默认关系是or关系$arr=$m->where($data)->select();BETWEEN$data['id']=array('between',array(5,7));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( (`id` BETWEEN 5 AND 7 ) )$data['id']=array('not between',array(5,7));//注意,not 和between中间一定要有空格$arr=$m->where($data)->select();IN$data['id']=array('in',array(4,6,7));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( `id` IN (4,6,7) )$data['id']=array('not in',array(4,6,7));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( `id` NOT IN (4,6,7) )三、区间查询$data['id']=array(array('gt',4),array('lt',10));//默认关系是and 的关系//SELECT * FROM `tp_user` WHERE ( (`id` > 4) AND (`id` < 10) )$data['id']=array(array('gt',4),array('lt',10),'or') //关系就是or的关系$data['name']=array(array('like','%2%'),array('like','%五%'),'gege','or');四、统计查询count //获取个数max //获取最大数min //获取最小数avg //获取平均数sum //获取总和五、SQL直接查询a、query 主要数处理读取数据的成功返回数据的结果集失败返回boolean false$m=M();$result=$m->query("select * from t_user where id >50");var_dump($result);b、execute 用于更新个写入操作成功返回影响行数失败返回boolean false$m=M();$result=$m->execute("insert into t_user(`username`) values('ztz3')");var_dump($result);------------------EIGHT---------------------------一、常用连贯操作1.where帮助我们设置查询条件2.order对结果进行排序$arr=$m->order('id desc')->select();$arr=$m->order(array('id'=>'desc','sex'=>'asc'))->select();3.limit限制结果limit(2,5)limit('2,5')limit(10)//limit(0,10)4.field设置查询字段field('username as name,id')field(array('username'=>'name','id')field('id',true) //获取除了id以外的所有字段5.table6.group7.having二、补充alias 用于给当前数据表定义别名字符串page 用于查询分页(内部会转换成limit)字符串和数字join* 用于对查询的join支持字符串和数组union* 用于对查询的union支持字符串、数组和对象distinct 用于查询的distinct支持布尔值lock 用于数据库的锁机制布尔值cache 用于查询缓存支持多个参数(以后在缓存部分再详细描述)relation 用于关联查询(需要关联模型扩展支持)字符串validate 用于数据自动验证数组auto 用于数据自动完成数组filter 用于数据过滤字符串scope* 用于命名范围字符串、数组------------------NINE---------------------------一、模板的使用(重点)a、规则模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl)更换模板文件的后缀名(修改配置文件)'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名b、修改模板文件目录层次'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次c、模板主题'DEFAULT_THEME'=>'your',//设置默认模板主题需要在TPL下面新建一个your文件夹作为模板主题文件夹如何动态修改模板主题?1、在后台准备一个功能,修改config.php文件中的默认模板项2、通过url传递t=主题参数可以修改不同的模板'DEFAULT_THEME'=>'your',//设置默认模板主题'TMPL_DETECT_THEME'=>true,//自动侦测模板主题'THEME_LIST'=>'your,my',//支持的模板主题列表二、输出模板内容(重点)a、display1.display中没有参数$this->display();2.可以带参数$this->display(本模块文件夹下的其他模板文件);$this->display('index2');$this->display(其他文件夹下的模板文件);$this->display('Public:error');//注意,仅仅需要在Tpl下有Public文件夹以及其中的error.html 即可,不需要一定有Public模块$this->display(其他主题下的文件夹下的模板文件);//需要开启主题支持$this->display('my:Index:index');$this->display(一个url路径);$this->display('./Public/error.html');$this->display('./Public/error.html','utf-8','text/xml');$this->show($content);3.fetch方法获得模板文件中的内容,以字符串形式返回$content=$this->fetch('Public:error');4.show方法不需要模板文件,可以直接输出模板内容$content=$this->fetch('Public:error');dump($content);$content=str_replace('h1','i',$content);$this->show($content);三、模板中的赋值(重点)//$this->assign('name','赵桐正');$this->name='赵桐正2';$this->display();四、模板替换(重点)__PUBLIC__:会被替换成当前网站的公共目录通常是/Public/__ROOT__:会替换成当前网站的地址(不含域名)__APP__:会替换成当前项目的URL地址(不含域名)__GROUP__:会替换成当前分组的URL地址(不含域名)__URL__:会替换成当前模块的URL地址(不含域名)__ACTION__:会替换成当前操作的URL地址(不含域名)__SELF__:会替换成当前的页面URL更换模板变量规则,修改配置项'TMPL_PARSE_STRING'=>array( //添加自己的模板变量规则'__CSS__'=>__ROOT__.'/Public/Css','__JS__'=>__ROOT__.'/Public/Js',------------------TEN---------------------------一、变量输出(重点)1.标量输出2.数组输出{$name[1]}{$name['k2']}{$name.k1}3.对象输出{$name:k}{$name->k}二、系统变量{$Think.get.id}三、使用函数{$name|strtoupper} 生成的编译后文件是<?php echo (strtoupper($name)); ?>{$name|date='Y m d H:i:s',###}四、默认值{$name|default='这里是默认值'}五、运算符{$name++}。
thinkphp3.2笔记(4)模板函数的使用foreach标签
thinkphp3.2笔记(4)模板函数的使⽤foreach标签⼀模板函数的使⽤1.代码效果:函数会按照从左到右的顺序依次调⽤。
如果你觉得这样写起来⽐较⿇烦,也可以直接这样写:{:substr(strtoupper(md5($name)),0,3)}默认值输出{$user|default="这家伙很懒,什么也没留下"}2 模板运算符{:3+4*2-1} 效果10{3+4*2-1} 效果 {3+4*2-1}在使⽤运算符的时候,不再⽀持点语法和常规的函数⽤法,例如:{$user.score+10} //错误的{$user['score']+10} //正确的{$user['score']*$user['level']} //正确的{$user['score']+myFun($user['level'])} //正确的⼆ foreach 标签foreach标签类似与volist标签,只是更加简单,没有太多额外的属性,例如:<foreach name="list" item="vo">{$vo.id}:{$}</foreach>name表⽰数据源 item表⽰循环变量。
可以输出索引,如下:<foreach name="list" item="vo" >{$key}|{$vo}</foreach>也可以定义索引的变量名<foreach name="list" item="vo" key="k" > { $k}|{$vo}</foreach>三 if标签与⽐较标签⽐较标签⽐较标签⽤于简单的变量⽐较,复杂的判断条件可以⽤if标签替换,⽐较标签是⼀组标签的集合,基本上⽤法都⼀致,如下:<⽐较标签 name="变量" value="值">内容</⽐较标签>系统⽀持的⽐较标签以及所表⽰的含义分别是:标签含义eq或者 equal 等于neq 或者notequal 不等于gt ⼤于egt ⼤于等于lt ⼩于elt ⼩于等于heq 恒等于nheq 不恒等于他们的⽤法基本是⼀致的,区别在于判断的条件不同,并且所有的⽐较标签都可以和else标签⼀起使⽤。
ThinkPHP教学笔记剖析
ThinkPHP课程目标:1、关于mvc和tp的简介2、快速入门3、学习tp中的各个组件(M、V、C)控制器模型视图4、实用项关于MVC和TP的简介:一、什么是框架框架,即framework。
其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。
二、为什么使用框架●代码重用●合理分工●解决多人协作开发问题三、主流的php框架●Zend Framework●Yii●Symfony●Codelgniter●ThinkPHP●……四、什么是MVC●MVC是施乐帕克研究中心(Xerox PARC)在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。
●MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。
使用MVC应用程序被分成三个核心部件:模型、视图、控制器。
●M:model模型表示企业数据和业务规则●V:view视图是用户看到并与之交互的界面●C:controller控制器接受用户的输入并调用模型和视图去完成用户的需求我们去吃饭,大堂经理问我们:客官来点什么?我们:来地沟油!经理让服务员将我们带到包房经理将我们点的菜发给厨房厨房开始做菜,好了之后,通知经理经理让服务员将菜端给我们经理:控制器后厨:模型菜:数据服务员:视图五、获取ThinkPHP●●下载thinkphp3.0●直接部署到项目中●php5.2所有tp版本要求php必须是5以上的,tp3中要求是5.2以上的快速入门一、了解TP目录结构将下载的tp3.0压缩包进行解压,可看到两个夹:Examples:代码示例ThinkPHP:这是我们想用的框架程序我们需要将Thinkphp 文件夹移动至我们的项目中,打开ThinkPHP文件夹,可以看到如下内容:●ThinkPHP.php 框架入口文件●Common 框架公共文件目录●Conf 框架配置文件目录●Lang 框架系统语言目录●Lib系统核心基类库目录●Tpl 系统模板目录●Extend 框架扩展目录二、开发流程●创建项目,并将ThinkPHP获得●创建入口文件●配置项目●创建控制器●创建模型(可以不存在自定义模型)●创建模板●运行调试,调优●部署到生产环境三、入口文件●所有项目都是从入口文件开始的●定义框架路径●定义项目路径●定义项目名称●载入框架入口文件四、第一个ThinkPHP项目1、创建项目2012,将thinkphp复制到我们网站的根路径下,在htdocs下创建index.php文件●require("ThinkPHP/ThinkPHP.php");●THINK_PATH●APP_NAME●APP_PATH在tp中,由于目录结构稍微复杂,所以在第一次访问入口文件时,会帮助我们自动创建项目结构运行路径:http://localhost/index.php,可以看到如下界面,说明运行成功2、了解项目目录结构●Common 项目公共文件目录●Conf 项目配置目录●Lang 项目语言包目录●Lib项目类库目录●Tpl 项目模板目录●Runtime项目运行时目录3、为什么输入地址之后,可以看到内容http://localhost/index.php由于请求的是这个url,如果没有写任何信息,表示请求Index模块的index动作也就是说:会自动请求IndexAction这个类下的index方法为什么这样自动请求??●DEFAULT_MODULE:默认的默认模块名●DEFAULT_ACTION:默认的动作名这个是由于这两个配置选项来决定的在配置文件Conf/config.php中添加如下内容:这时会请求StudentAction这个类下的add方法。
笔记(自己整理的thinkphp笔记)
笔记(⾃⼰整理的thinkphp笔记)ThinkphpLesson_1 ThinkPHP.3.1.2.介绍及安装1.总结a)Home放前台,Admin放后台, Public放共有的资源2.配置gvim打开安装⽬录下的_vimrc⽂件,添加set nu! 显⽰⾏数colorscheme darkblue 背景颜⾊设置为深蓝⾊gvim配置不⾃动⽣成备份⽂件默认情况下⽤gVim编辑⽂件时,会⾃动⽣成带~的备份⽂件。
如果不想在编辑⽂件时⾃动⽣成备份⽂件的话,可以这么做:打开gVim安装⽬录下的vimrc_example.vim,将其中的如下部分中的else语句⽤引号注释掉:if has("vms")set nobackup " do not keep a backup file, use versions insteadelseset backup " keep a backup file即将上⾯四句改为:if has("vms")set nobackup " do not keep a backup file, use versions instead" else" set backup " keep a backup file⾥,else部分⽤双引号注释掉即可。
set backup是设置使⽤⾃动⽣成备份⽂件的命令。
windows上gvim的编码设置Windows系统默认的编码是cp936,所以⽤gvim⼀打开⽂件,默认是⽤gb2312编码打开的。
这导致很多时候打开的⽂件是乱码,不能正常显⽰,那要怎么解决这个问题呢?很简单,看下⾯的设定:打开gvim,到菜单栏找到“编辑”,在下拉菜单找到“启动设定”点击“启动设定”进去,你会看到相应的配置⽂件在⽂件的末尾加⼊如下设定:set encoding=utf-8set fileencodings=utf-8,chinese,latin-1if has("win32")set fileencoding=chineseelseset fileencoding=utf-8endifsource $VIMRUNTIME/delmenu.vimsource $VIMRUNTIME/menu.vimlanguage messages zh_CN.utf-8保存后退出gvim,重新启动,惊喜出现了,乱码不见了,是不是很简单,可以动⼿试⼀试了!3.ThinkPHP核⼼⽂件介绍├─ThinkPHP.php 框架⼊⼝⽂件├─Common 框架公共⽂件├─Conf 框架配置⽂件├─Extend 框架扩展⽬录├─Lang 核⼼语⾔包⽬录├─Lib 核⼼类库⽬录│├─Behavior 核⼼⾏为类库│├─Core 核⼼基类库│├─Driver 内置驱动││├─Cache 内置缓存驱动││├─Db 内置数据库驱动││├─TagLib 内置标签驱动││└─Template 内置模板引擎驱动│└─Template 内置模板引擎└─Tpl 系统模板⽬录4.项⽬⽬录结构及说明Home 前台应⽤⽂件夹├─Common 项⽬公共⽂件⽬录├─Conf 项⽬配置⽬录├─Lang 项⽬语⾔⽬录├─Lib 项⽬类库⽬录│├─Action Action类库⽬录│├─Behavior ⾏为类库⽬录│├─Model 模型类库⽬录│└─Widget Widget类库⽬录├─Runtime 项⽬运⾏时⽬录│├─Cache 模板缓存⽬录│├─Data 数据缓存⽬录│├─Logs ⽇志⽂件⽬录│└─Temp 临时缓存⽬录└─Tpl 项⽬模板⽬录Lesson_2 ThinkPHP.3.1.2.MVC模式和URL访问1.字符串串接的⽅法使⽤’ . ’分割的两个字符串会在显⽰时串接起来2.开启调试功能有时由于缓存的原因,导致⾃⼰做的修改不能⽴即⽣效, 此时删除Runtime⽂件夹即可, 也可以开启调试模式, 这样系统不会再缓存. 但是建议在项⽬搭建到服务器时,关闭调试模式开启调试功能(在项⽬⽂件夹下的index.php中)define('APP_DEBUG',true);我们需要设置配置⽂件(Conf/config.php),开启页⾯trace'SHOW_PAGE_TRACE'=>true,//开启页⾯Trace3.ThinkPHP的MVC对应的⽬录M 项⽬⽬录/应⽤⽬录/Lib/ModelV 项⽬⽬录/应⽤⽬录/TplC 项⽬⽬录/应⽤⽬录/Lib/Action4.url的4种访问⽅式PATHINFO 模式-- 重点http://域名/项⽬名/⼊⼝⽂件/模块名/⽅法名/键1/值1/键2/值2例如: http://localhost/thinkPHPTest/Index.php/Index/show/name/yinliang访问的是\Home\Lib\Action\ IndexAction.class.php的index⽅法,并将name=’yinliang’传递给后台普通模式http://域名/项⽬名/⼊⼝⽂件?m=模块名&a=⽅法名&键1=值1&键2=值2 例如: http://localhost/thinkPHPTest/Index.php?m=Index&a=show&name=yinliang&age=12REWRITE模式http://域名/项⽬名/模块名/⽅法名/键1/值1/键2/值2兼容模式http://域名/项⽬名/⼊⼝⽂件?s=模块名/⽅法名/键1/值1/键2/值2Lesson_3,4 ThinkPHP.3.1.2.输出和模型使⽤1.配置项⽬⽂件详解(__ROOT__\Home\Conf\config.php)'URL_PATHINFO_DEPR'=>'/',//修改URL的分隔符'TMPL_L_DELIM'=>'<{', //修改左定界符'TMPL_R_DELIM'=>'}>', //修改右定界符'DB_TYPE'=>'mysql', //设置数据库类型'DB_HOST'=>'localhost',//设置主机'DB_NAME'=>'thinkphp',//设置数据库名'DB_USER'=>'root', //设置⽤户名'DB_PWD'=>'', //设置密码'DB_PORT'=>'3306', //设置端⼝号'DB_PREFIX'=>'tp_', //设置表前缀'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使⽤DSN⽅式配置数据库信息'SHOW_PAGE_TRACE'=>true,//开启页⾯Trace'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板⽂件后缀名'TMPL_FILE_DEPR'=>'_',//修改模板⽂件⽬录层次'TMPL_DETECT_THEME'=>true,//⾃动侦测模板主题'THEME_LIST'=>'your,my',//⽀持的模板主题列表'TMPL_PARSE_STRING'=>array( //添加⾃⼰的模板变量规则'__CSS__'=>__ROOT__.'/Public/Css','__JS__'=>__ROOT__.'/Public/Js',),'LAYOUT_ON'=>true,//开启模板渲染'URL_CASE_INSENSITIVE'=>true,//url不区分⼤⼩写'URL_HTML_SUFFIX'=>'html|shtml|xml',//限制伪静态的后缀'APP_GROUP_LIST' => 'Home,Admin', //项⽬分组设定'DEFAULT_GROUP' => 'Home', //默认分组2.项⽬配置(__ROOT__\index.php)//1.确定应⽤名称Homedefine('APP_NAME','Home');//2.确定应⽤路径define('APP_PATH','./Home/');//3.开启调试模式define('APP_DEBUG',true);//4.应⽤核⼼⽂件require './ThinkPHP/ThinkPHP.php'>3.获取表单中的数据html中的form表单如下⽤户名密码验证码获取表单数据的Action对象函数如下public function do_login(){echo "fasdfasdfsd";dump($_POST['username']);}注:如果表单中的method="get",则上述函数中的$_POST要改为$_GET4.超链接地址的写法同项⽬下的超链接可不写ip地址如要访问项⽬thinkphp下的UserAction中的delete函数,可写为delete但是为了防⽌因项⽬名称(thinkphp)的更改,导致系统不能使⽤,可使⽤”__URL__”替换”/thinkphp/index.php/User/”,如以上地址改写为delete5.ThinkPHP 3 的输出a)通过echo 等PHP原⽣的输出⽅式在页⾯中输出b)通过display⽅法输出,如想分配变量可以使⽤assign⽅法,如在Action中// 本类由系统⾃动⽣成,仅供测试⽤途class IndexAction extends Action {public function index(){$this->assign('name','yinliang'); //给变量name分配值yinliang$this->display(); //输出Home\Tpl\Index\index.html}public function show(){echo "show: hello world";}}>html页⾯中显⽰的⽅法:在Home\Tpl\Index\index.html中要访问name变量可以在⽂件中添加{$name}(修改了左右定界符的则把{,}分别修改为修改后的左右定界符) 如:Hello {$name}6.建议修改左右定界符(为了防⽌{$data }与Jquery语法混淆)休要修改配置⽂件(Conf/config.php)中的配置项'TMPL_L_DELIM'=>'<{', //修改左定界符'TMPL_R_DELIM'=>'}>', //修改右定界符7.ThinkPHP 3 的模型使⽤(与数据库链接,操作数据库)a)创建数据库的步骤i.进⼊phpmyadmin URL为http://127.0.0.1/phpmyadmin/ii.点击数据库标签跳转到创建数据库的页⾯iii.左侧的输⼊框输⼊数据库的名字(例如thinkphp3), 右侧选择数据库编码为utf8_general_ci 点击创建iv.点击创建的数据库(例如thinkphp3),即可创建表v.先输⼊要创建的表的名字, 再输⼊标的字段数,点击执⾏vi.接下来的页⾯A_I表⽰⾃增, 索引下拉列表可以选择主键,唯⼀等属性, 整理表⽰编码格式vii.存储引擎选择MyISAMviii.……………………………..b)配置数据库(在Conf/config.php中配置数据库相关信息)'DB_TYPE'=>'mysql', //设置数据库类型'DB_HOST'=>'localhost',//设置主机'DB_NAME'=>'thinkphp',//设置数据库名'DB_USER'=>'root', //设置⽤户名'DB_PWD'=>'', //设置密码'DB_PORT'=>'3306', //设置端⼝号'DB_PREFIX'=>'tp_', //设置表前缀加表前缀是为了更好的区分表,⽐如cw_代表财务cg_代表采购,如果没有表前缀,则将tp_去掉即可注: 也可以使⽤DSN⽅法进⾏配置'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使⽤DSN⽅式配置数据库信息如果两种⽅式同时存在,以DSN⽅式为优先c)在Action的index函数中获取值public function index(){$m=new Model(User);//记住U⼤写$arr=$m->select();//user表中的所有数据都被放到数组$arr中$this->assign('name',$arr[1]['username']);//将name赋值为数组$arr中下标为//1的元素的username的值$this->display();}d)还有⼀种简单实⽤模型的⽅式M() 等效为new Model();$m=M('User');$arr=$m->select();e)使⽤模型的实例可以对数据进⾏操作,操作的⼯作⼀般就是对数据库进⾏增删改查CURD增-C Create $m->add()删-D Delete $m->delete()改-U Update $m->save()查-R Read $m->select()f)模板可以遍历数组:html页⾯中<{$vo.id}>----<{$/doc/6fc0f7fadd3383c4bb4cd2f2.html ername}>-----<{$vo.sex}>在Action中的index中给array赋值public function index(){$m=new Model('User');$arr=$m->select();$this->assign('array',$arr);$this->assign('name',$arr[1]['username']);$this->display();}Lesson_5,6,7 ThinkPHP.3.1.2.输出和模型使⽤.21.ThinkPHP 3.1.2 CURD特性a)ThinkPHP 3 读取数据对数据的读取Read$m=new Model('User');$m=M('User');select$m->select();//获取所有数据,以数组形式返回find$m->find($id);//获取单条数据getField(字段名)//获取⼀个具体的字段值$arr=$m->where('id=2')->getField('username');b)ThinkPHP 3 创建数据对数据的添加Create$m=new Model('User');$m=M('User');$m->字段名=值$m->add();返回值是新增的id号代码⽰例:public function add(){$m=new Model('User');$m->username=$_POST['username'];$newId=$m->add();if($newId>0){$this->success("Add new user successfully",index);$this->error("Add new user failed",index);}}c)ThinkPHP 3 删除数据$m=M('User');$m->delete(2); //删除id为2的数据$m->where('id=2')->delete(); //与上⾯效果相同,也是删除id为2的数据返回值是受影响⾏数代码⽰例:public function delete(){$id=$_GET['id'];$m=new Model('User');var_dump($id);// $m->delete(11);$count=$m->where('id='.$_GET['id'])->delete();if($count>0){$this->success("Data have been delete successfully");// $this->success("数据删除成功");}else{$this->error("The operation of deleting data exit error");// $this->error("数据删除失败");}}d)ThinkPHP 3 更新数据$m=M('User');$data['username']='ztz2';$m->save($data);返回值是受影响⾏数代码⽰例:public function update(){$m=new Model('User');$data['username']=$_POST['username'];$data['sex']=$_POST['sex'];$count=$m->save($data);if($count>0){$this->success("Data have been modify successfully",index);}else{$this->error("The operation of modifing data exit error",index);}}Lesson_8,9,10 ThinkPHP.3.1.2.查询⽅式的⼀般使⽤1.ThinkPHP 3.1.2 查询⽅式a)find只能查询⼀天记录,select可以查询多条记录i.普通查询⽅式ii.字符串$arr=$m->where("sex=0 and username='gege'")->find();iii.数组$data['sex']=0;$data['username']='gege';$arr=$m->where($data)->find();注意:这种⽅式默认是and的关系,如果使⽤or关系,需要添加数组值$data['sex']=0;$data['username']='gege';$data['_logic']='or';iv.表达式查询⽅式$data['id']=array('lt',6);$arr=$m->where($data)->select();EQ 等于NEQ不等于GT ⼤于EGT⼤于等于LT ⼩于ELT⼩于等于⽰例代码:public function show(){$m=new Model('User');$data['id']=array("LT",25);$arr=$m->where($data)->select();var_dump($arr);$this->display();}b)LIKE 模糊查询$data['username']=array('like','%ge');//查询username以ge结尾的user$data['username']=array('like','%ge%');//查询username包含ge的user$arr=$m->where($data)->select();c)NOTLIKE$data['username']=array('notlike','%ge%'); //查询username不包含ge的user$arr=$m->where($data)->select();注意:如果⼀个字段要匹配多个通配符$data['username']=array('like',array('%ge%','%2%','%五%'),'and');//如果没有第三个值,默认关系是or关系$arr=$m->where($data)->select();d)BETWEEN$data['id']=array('between',array(5,7));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( (`id` BETWEEN 5 AND 7 ) )$data['id']=array('not between',array(5,7));//注意,not 和between中间⼀定要有空格$arr=$m->where($data)->select();e)IN$data['id']=array('in',array(4,6,7));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( `id` IN (4,6,7) )$data['id']=array('not in',array(4,6,7));$arr=$m->where($data)->select();//SELECT * FROM `tp_user` WHERE ( `id` NOT IN (4,6,7) )f)区间查询$data['id']=array(array('gt',4),array('lt',10));//默认关系是and 的关系//SELECT * FROM `tp_user` WHERE ( (`id` > 4) AND (`id` < 10) )$data['id']=array(array('gt',4),array('lt',10),'or') //关系就是or的关系$data['username']=array(array('like','%2%'),array('like','%五%'),'gege','or');g)统计查询count //获取个数$data['username']=array(array("LIKE","%s%"),array("LIKE","%d%"),array("LIKE","%g%"),"or"); echo $m->where($data)->count();max //获取最⼤数echo $m->max("id");min //获取最⼩数echo $m->min("id");avg //获取平均数echo $m->avg("id");sum //获取总和echo $m->sum("id");h)SQL直接查询query 主要数处理读取数据的` 成功返回数据的结果集失败返回boolean false$m=M();$result=$m->query("select * from tp_user where id >50");var_dump($result);execute ⽤于更新个写⼊操作成功返回影响⾏数失败返回boolean false$m=M();$result=$m->execute("insert into tp_user(`username`) values('ztz3')");var_dump($result);2.总结a)多条件检索时, 从页⾯传递给后台的某个值可能为空. 可以使⽤isset函数进⾏判断, 如:if(isset($_POST[‘username’])&& $_POST[‘username’]!=null){$where[‘username’] = array(‘like’,” %{$_POST[‘username’]}% ”);}Lesson_11 ThinkPHP 3.1.2 连贯操作1.PHP中类的构造⽅法所有类的构造⽅法都如下,只是参数可以不⼀样function __construct($tableName){}2.字符串操作函数AddSlashes: 字符串加⼊斜线。
ThinkPHP学习记录
ThinkPHP学习记录MVC:现在我们总绌MVC的处理过程,首先控制器接收用户的请求,来决定应调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的规图格式化模型返回的数据,并通过表示层呈现给用户。
对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。
内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。
因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
AOP(面向方面编程),可以说是OOP(面向对象编程)的补充和完善。
OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。
当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。
也就是说,OOP 允许定义从上而下的关系,但并不适合定从左到右的关系。
而AOP技术则恰恰相反,它刟用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。
所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便亍减少系统的重复代码,降低模块间的耦合度。
AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。
而剖开的切面,也就是所谓的“方面”了。
使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。
业务处理的主要流程是核心关注点,不与之关系不大的部分是横切关注点。
横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。
比如权限认证、日志、事务处理。
Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
ThinkPHP学习笔记
ThinkPHP框架ThinkPHP框架 (1)Day01 (3)一、如何学习框架: (3)2.ThinkPHP (3)2.1配置tp框架 (3)A/安装好.下载源码包 (3)B/新建一个项目目录shop (3)C/编写入口程序index.php (3)2.2项目目录说明: (4)2.3 url地址模式(4种): (4)2.4修改默认的控制器及方法名称: (4)2.5编写控制器: (4)2.51编写控制器规则: (4)例子:声明控制器Test (5)2.6Action的方法: (5)1)给模板传值 (5)2)显示模板 (5)3)跳转提示 (5)4)失败跳转 (6)练习: (6)2.7 m层的编写: (7)1、链接数据库 (7)2、测试数据库连接是否成功。
(7)3.数据模型类:(会员注册) (7)《例3.1.1userController》 (7)《3.1.2UserModel.class.php》 (8)3.1增加: (10)3.2查询: (11)3.2.1普通查询 (11)《例》 (11)3.2.2分组查询: (12)3.2.3链接查询: (12)Day02 (12)2.创建分组: (12)3.后台: (13)4.修改文章 (13)5.自动验证 (13)《例》自动验证 (14)6.自动填充: (15)《例》自动验证 (15)Day03 ==>V层: (15)1.Think标签 (15)1.1变量标签 (15)1.2循环标签 (16)1.3条件标签 (16)1.4变量调节器 (17)1.5模板引用标签 (17)1.6常量调用 (17)1.7预定义变量调用 (17)1.8模板替换标签,作用,用来产生url (17)Day04 (18)ThinkPHP总结: (19)一、如何学习框架: (19)1、url地址规则:(可能面试) (20)2.1 c层控制器规则: (20)2.2 Action基类的方法: (20)2.3、M层规则: (20)2.4定义模型的语法格式 (20)2.5获得模型对象的方法 (21)2.6 Model的方法: (21)2.6.1查询语句的语法格式 (21)select 字段列表from 表名 (21)表链接查询的语法格式 (22)2.6.2数据库操作写法例举: (22)2.6.3数据库操作写法例举: (23)3.1Think标签 (23)3.2变量调节器 (25)3.2页面重定向 (25)3.3 success页面 (25)3.4 ThinkPHP分页类的位置 (25)3.5ThinkPHP表单所有验证方式 (26)4.公共类: (26)4.1分页类 (26)4,2分页类步骤: (26)《例:分页类》 (27)4.3文件(图片)上传类:步骤 (27)《例:多文件上传》 (28)4.4验证码 (29)《例:验证码》 (29)Day01框架:项目的必要代码。
最新ThinkPHP学习笔记
Thinkphp1.单入口原理访问任何文件都必须通过某一个固定文件,如index.php,这就是单入口原理。
2.百度收录网站的时候,更倾向于目录和静态文件。
3.基础项目中一个模块就是一个文件夹,模块的增删改查操作就是文件夹里对应的文件。
4.在ThinkPHP中,一个模块就是一个类文件,也就是模块文件,而模块的增删改查操作,就是该类文件中的对应的方法。
5.在ThinkPHP中,要增加一个功能模块就是要加一个类文件,即模块文件,要对该模块增加一个操作,就是在该类文件中加一个方法。
6.在PHP中,在回标签(?>)之后不能有任何输出,包括空格,否则在被包含时可能会报错。
7.为了保险起见,不要加回标签(?>);8.在TP中有全局配置文件,这里的配置文件影响每一个应用,但有时候我们需要改变某个应用的配置项。
那么,我们就需要单独为该应用进行配置,这就是局部配置文件,、。
9.局部配置文件的优先级高于全局配置文件。
10.配置文件在项目的conf中。
11.要想读取配置文件中的任何一个选项,可以用一个C()方法。
例如:echo C('DEFAULT_CHARSET');12.C()方法用于获取配置文件中的选项。
(大写C);13.函数跟踪,在学习或观看一个项目时,为了知道某个函数的来源,需要对函数进行跟踪定位。
14.公共函数:在TP的Common中的common.php中的函数即为公共函数,可以在项目的任何地方使用。
15.局部函数:在项目应用中的Common中的common.php 文件中定义的函数,即为局部函数,该函数只在该应用中有效,在其他应用中不能使用。
16.公共类文件。
17.自定义类文件。
18.如何使用并包含自定义类文件。
Import(‘ORG.Mycls.Person’);$user=new Person();$user->show();19.定义变量并分配模板;public function index(){$name="李帅帅";$age="22";$this->assign('name',$name);$this->assign('age',$age);$this->display();}在模板中是这样接收:<h1>{$name}</h1><h1>{$age}</h1>20.定义控制器在Action文件夹中新建一个UserAction.class.php,即完成一个控制器的定义。
thinkphp学习笔记
一、框架文件介绍二、创建应用1.在项目目录创建入口文件2.创建虚拟主机,访问应用三、路由形式1.什么是路由答:系统从URl参数中分析出当前请求分组、控制器和操作的过程就是“路由”。
2.Tp框架路由共有4种形式①基本get形式http://网址/index.php?m=分组&c=控制器&a=操作方法该方式是最底层的get形式、传统的参数传递方式,不时尚、不安全。
②pathinfo路径形式[默认方式]http://网址/index.php/分组/控制器/操作方法http://网址/index.php/Home/Index/advert③rewrite重写形式(伪静态技术)省略index.php入口文件http://网址/分组/控制器/操作方法http://网址/Home/Index/index④兼容形式http://网址/index.php?s=/分组/控制器/操作方法http://网址/index.php?s=/Home/Index/advert以上四种形式除了第③种,其他的url模式都可以使用四、创建控制器五、View视图模板入口程序文件index.php路由解析(控制器、操作方法)1.简单模板view调用$this->display(); //模板名称及当前控制器、当前操作方法的名称一致$this->display(模板名称); //调用当前控制器对应目录指定名称的模板$this->display(控制器/模板名称); //调用其他控制器下的具体模板文件Tp框架有两种模式:开发(调式)、生产【默认】生产模式:错误提示模糊开发模式:错误提示友好define(‘APP_DUBUG’ ,true); //开发define(‘APP_DUBUG’ ,false); //生产2.已有模板及tp框架做结合具体实现步骤:A.复制模板文件到View指定目录B.复制css、img、js静态文件到系统指定目录C.把静态资源(css、img、js)文件的路径设置为“常量”信息(在index入口文件设置)D.在模板文件中通过常量引入静态资源(css、img、js)文件,路径相对入口文件设置最好设置绝对地址(相对工作站点虚拟主机目录的绝对地址)为了后期模板维护方便,通过常量设置静态资源文件访问目录地址E.css文件本身的图片设置,其路径相对c ss文件本身设置后续a、d重复实现即可2.1静态资源文件引入2.2静态资源文件存放①通过独立路由可以访问②不要暴露太多目录信息在模板index.html里边引入css文件,相对地址为什么相对index.php入口文件设置?Index.php+Controller控制器+模板文件==混编文件引入css文件2.3 css文件引入图片路径设置绝对、相对地址:一个文件引入另一个文件,另一个文件的相对地址就相对引入文件设置。
ThinkPHP6学习随笔
ThinkPHP6学习随笔1、数据库在保存时,会因为数据表不存在或者数据类型原因导致系统报错,从⽽保存失败,$data =['title'=>'title1','aaa'=>'writer1'];$res = Db::name('article')->insert($data);如果aaa字段不存在,就会报错,⽤到->strict(false)$res = Db::name('article')->strict(false)->insert($data);这样即可过滤tp错误,成功执⾏2、插⼊成功后,⽣成ID,⽤insertGetId($data)可以获得$data =['title'=>'title1','title'=>'writer1'];$res = Db::name('article')->strict(false)->insertGetId($data);返回新插⼊的ID3、游标查询,->select()⽅式查询内存消耗⼤,可以考虑使⽤->cursor();foreach循环300条数据,就可以么明显发现内存开销变⼤了4、如果->save(['name' = 'name1234'])没有传⼊主键id,就会插⼊⼀条新数据如果->save(['id'=1,'name' = 'name1234'])传⼊了id就更新数据,使⽤->where('name','name1234')->save(['name' = 'name1234'])也是更新,⽽不是插⼊。
简单介绍ThinkPHP3.1.3使用笔记
简单介绍ThinkPHP3.1.3使⽤笔记ThinkPHP是国内⼀款⾮常不错的框架了,在学习ThinkPHP之前进我们必须了解php mysql及mvc模式了,懂了这些你才可以学习ThinkPHP了,下⾯我就简单的介绍我的学习笔记吧。
框架只是⼯具,它只是将你所经常⽤的代码按照⼀定的模式整理起来。
⽅便程序员快速开发,也⽅便团队协调⼯作。
但框架的基础是语⾔。
如果连PHP有多少个超级全局变量都不知道的话,还是需要返回去好好打打基础。
磨⼑不误砍柴⼯。
我的⼀个前辈说过,阅读⾼⼿写的代码是程序员迅速提升的最佳捷径。
确实是这样,如果只是照着书写个简单的增改删查,也许你永远是⼀个低级程序员(也写程序猿,也写程序媛)。
要⼤胆的跳出思维限制。
在⾃⼰尝试学习的时候要多改框架。
积极使⽤echo,print_r,var_dump等。
在你驾驭了框架的时候,当然可以按照⾃⼰的实际需求修改了,它再⽜逼也是你完成项⽬的⼯具⽽已。
就像骑车⼦,先可以买整车,当充分了解的时候,你就可以按照⾃⼰的需求组车了。
兴趣是学习最⼤的动⼒。
如果喜欢,⼀定坚持下去。
我觉得现在的社会⼤部分⼈的幸福指数是很低的,⼯作虽然是糊⼝的⼿段,但也是陪伴⼏乎你⼀⽣的东西,不要⼲了⼏⼗年⾃⼰的⼯作,回头想想没有⼀点乐趣。
学习ThinkPHP之前需要掌握的东西:PHP,MySql,MVC模式。
再说ThinkPHP框架缓存之前,我想说说,ThinkPHP绝对是可以和CI相媲美的优秀框架。
⽽且是国内数⼀数⼆的PHP框架。
TP中有⼀个常量APP_DEBUG,位于⼊⼝⽂件ThinkPHP.php中。
这个常量是⽤来设置是否开启调试模式,我们可以在引⼊⼊⼝⽂件前进⾏⾃定义。
如果将其置为FALSE,则会在runtime⽂件夹下⽣成⼀份~runtime.php的⽂件(路径和⽂件名均可修改)。
但是⽂件去掉注释,空格和换⾏。
如果直接看这份⽂件,太过费事。
查看源码,我们可以在runtime.php中找到⼀个函数:build_runtime_cache(),在写⼊缓存前使⽤了函数strip_whitespace()。
THINKPHP学习笔记
Thinkphp学习笔记Thinkphp复习1、概况使用面向对象的开发结构和mvc模式,采用单一入口,融合了struts2的action 思想和jsp的taglib,ROR的orm映射和activerecord模式,封装了curd 常用操作,支持多数据库切换,分布式数据库,缓存,用于敏捷web应用开发,简化企业级开发2、什么是LAMPLAMP是基于Linux,Apache,Mysql,PHP的开放资源网络开发平台Linux是开放的操作系统Apache是最通用的网络服务器Mysql是带有基于网络管理工具的关系数据库PHP是流行的对象脚本语言LAMP是强大的网站解决方案3、什么是OOP面向对象编程(Object Oriented Programming)是一种计算机编程架构达到的目标:重用性,灵活性,扩展性基本原则:计算机程序由单个能起到子程序作用的单元或对象组合而成,每个对象都能够接收信息、处理数据、向其他对象发送信息。
其他一些概念组件:数据和功能一起在运行着的计算机程序中形成的单元,组件是模块化和结构化的基础。
抽象性:封装性:每类组组件都提供了一些与其他组件进行通信的借口,并规定其调用方法多态性:4、什么是mvcMvc是一个设计模式,强调输入-处理-输出分开,应用程序被分为三个核心部件(模型M:表示企业数据和业务规则视图V:用户交互界面处理器C:接收用户的输入,并调用模型和视图完成用户的需求。
本身不输出任何东西和做任何处理,它只是接受请求并决定调用哪个模型部件去处理请求,然后确定用哪个视图显示模型处理后返回的数据)5、什么是ORM对象-关系映射(Object/relation map)面向对象开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。
业务实体在内存中表现为对象,存在关联和继承关系,在数据库中表现为关系数据,无法表达关联和继承关系。
ThinkPhp5笔记
ThinkPhp5笔记一、project 应用部署目录├─application 应用目录(可设置)│├─common 公共模块目录(可更改)│├─index 模块目录(可更改)││├─config.php模块配置文件││├─common.php模块函数文件││├─controller控制器目录││├─model模型目录││├─view视图目录││└─ ...更多类库目录│├─command.php 命令行工具配置文件│├─common.php 应用公共(函数)文件│├─config.php 应用(公共)配置文件│├─database.php 数据库配置文件│├─tags.php 应用行为扩展定义文件│└─route.php 路由配置文件├─extend 扩展类库目录(可定义)├─public WEB 部署目录(对外访问目录)│├─static 静态资源存放目录(css,js,image)│├─index.php 应用入口文件│├─router.php 快速测试文件│└─.htaccess 用于 apache 的重写├─runtime 应用的运行时目录(可写,可设置)├─vendor 第三方类库目录(Composer)├─thinkphp 框架系统目录│├─lang 语言包目录│├─library 框架核心类库目录││├─think Think 类库包目录││└─traits系统 Traits 目录│├─tpl 系统模板目录│├─.htaccess 用于 apache 的重写│├─.travis.yml CI 定义文件│├─base.php 基础定义文件│├─composer.json composer 定义文件│├─console.php 控制台入口文件│├─convention.php 惯例配置文件│├─helper.php 助手函数文件(可选)│├─LICENSE.txt 授权说明文件│├─phpunit.xml 单元测试配置文件│├─README.md README 文件│└─start.php 框架引导文件├─build.php 自动生成定义文件(参考)├─composer.json composer 定义文件├─LICENSE.txt 授权说明文件├─README.md README 文件├─think 命令行入口文件二、安装三、TP5运行原理(重点)技术:(1)mvc设计模式m 模型v 视图c 控制器原理:c调度M获取数据,加载视图将数据显示给客户端(2)模板引擎技术(TP5内置的模板引擎,并不是smarty)(3)命名空间在没有开启路由的情况下访问格式:index.php 入口文件index 应用下的模块Index 模块下的控制器index 控制器下的方法2.配置架构(重点)(1)搭建虚拟主机(2)构架<1>url 访问:不支持普通的模式只支持pathinfo模式pathinfo 模式:简化url地址,可以提高网站的收录排名,有利于seo 优化<2>开启错误调试:application/config.php// 应用调试模式'app_debug' => true,// 应用Trace'app_trace' => true,(3)配置3.路由(重点)(1)普通使用:Route::rule(路由规则,'模块/控制器/方法','请求方式','[伪静态设置]',[参数类型设置]);格式:Route::rule("/index/:id","index/Index/index5",'get',['ext'=>'h tml'],['id'=>'\d+']);(2)请求方式路由Route::get("路由规则","模块/控制器/方法");格式:Route::get("/test","index/Index/index");(3)快捷路由把所有的访问操作统统交给同一个路由规则(/test)处理Route::controller("路由规则","模块/控制器");格式:Route::controller("/test","index/Index");namespace app\admin\controller;app 应用admin 模块controller 控制器(4)路由别名通过路由别名访问控制器下的所有方法Route::alias("别名","模块/控制器");格式:Route::alias("users","admin/Test");4.控制器(重点)(1)控制器初始化_initializesession 在tp5里是自动开启session使用:<1>导入sessionuse think\Session;<2>session 设置 Session::set('session名字','session值');<3>session 获取 Session::get('session名字');<4>session 检测 Session::has("session 名字");<5>session 删除 Session::delete("session 名字");(2)重定向$this->redirect("/路由规则/方法"); 主要用于购物车和结算页. 无限分类<?phpnamespace app\admin\controller;//导入Controlleruse think\Controller;use think\Db;class Cate extends Allow{//加载添加模板public function getAdd(){//获取分类信息// $cate=Db::table("cates")->select();$cate=$this->cates();//加载模板return $this->fetch("Cate/add",['cate'=>$cate]); }//执行添加public function postInsert(){//创建请求对象$request=request();//获取pid和name参数$data=$request->only(['pid','name']);//获取pid参数$pid=$request->param("pid");//判断if($pid==0){//添加是顶级分类// echo "<pre>";// var_dump($data);//拼接path$data['path']="0";}else{//添加不是顶级分类// echo "<pre>";// var_dump($data);//获取父类信息 (id=$pid)$info=Db::table("cates")->where("id","{$pid}")->find();// echo "<pre>";// var_dump($info);//拼接path 父类path.父类id$data['path']=$info['path'].",".$info['id'];}// echo "<pre>";// var_dump($data);//执行数据库的插入if(Db::table("cates")->insert($data)){// echo "111";$this->success("添加成功","/cate/index");}else{// echo "000";$this->error("添加失败","/cate/add");}}//调整类别顺序加分隔符public function cates(){$cate=Db::query("select *,concat(path,',',id) as paths from cates order by paths");//遍历foreach($cate as $key=>$value){// echo $value['path']."<br>";//获取path$path=$value['path'];//把path 转换为数组$arr=explode(",",$path);// echo "<pre>";// var_dump($arr);//获取逗号个数$len=count($arr)-1;// echo $len."<br>";//str_repeat 重复字符串$cate[$key]['name']=str_repeat("---|",$len).$value['name']; }return $cate;}//分类列表public function getIndex(){//获取分类信息// $cate=Db::table("cates")->select();$cate=$this->cates();return $this->fetch("Cate/index",['cate'=>$cate]);}//执行删除public function getDelete(){//创建请求对象$request=request();$id=$request->param("id");//执行删除//判断当前类别下是否具有子类信息//获取$s=Db::table("cates")->where("pid","{$id}")->Count();// echo $s;if($s>0){$this->error("请先干掉孩子","/cate/index");}//执行删除if(Db::table("cates")->where("id","{$id}")->delete()){$this->success("删除成功","/cate/index");}else{$this->error("删除失败","/cate/index");}}public function getEdit(){$request=request();$id=$request->param("id");//获取需要修改的数据$info=Db::table("cates")->where("id","{$id}")->find();//获取类别信息$cate=Db::table("cates")->select();return$this->fetch("Cate/edit",['info'=>$info,'cate'=>$cate]);}//执行修改public function postUpdate(){$request=request();$id=$request->param('id');$data['name']=$request->param('name');if(Db::table("cates")->where("id","{$id}")->update($data)){ $this->success("修改成功","/cate/index");}else{$this->error("修改失败");}}}前台分类<?phpnamespace app\index\widget;use think\Controller;use think\Db;class Cate extends Controller{public function getcatebypid($pid){$cate=Db::table("cates")->where("pid",$pid)->select();$data=[];//遍历foreach($cate as $key=>$value){//shop 下标用来存储当前父类的子类信息$value['id']==子类pid$value['shop']=$this->getcatebypid($value['id']);$data[]=$value;}return $data;}//加载头部public function header(){$cate=$this->getcatebypid(0);//加载模板return $this->fetch("Cate:header",['cate'=>$cate]);}//加载尾部方法public function footer(){return $this->fetch("Cate:footer");}}><nav class="nav-main mega-menu"><ul class="nav nav-pills nav-main" id="mainMenu">{foreach name="cate" item="row"}<li class="dropdown"> <a class="dropdown-toggle" href="#"> {$row['name']} <i class="fa fa-angle-down"></i> </a> {if condition="$row['shop']"}<ul class="dropdown-menu">{foreach name="row['shop']" item="rows"}<li class="dropdown-submenu"> <a href="#">{$rows['name']}</a>{if condition="$rows['shop']"}<ul class="dropdown-menu">{foreach name="rows['shop']" item="rowss"}<li><a href="index.html">{$rowss['name']}</a></li>{/foreach}</ul>{/if}</li>{/foreach}</ul>{/if}</li>{/foreach}</ul></nav>用户添加修改<?phpnamespace app\admin\controller;//导入Controlleruse think\Controller;use think\Db;class User extends Allow{//列表public function getIndex(){$request=request();//获取搜索的关键词$keywords=$request->get('keywords');// echo $keywords;//获取数据$user=Db::table("users")->where('username',"like","%".$key words."%")->paginate(4);//加载模板return$this->fetch("User/index",['user'=>$user,'request'=>$request-> param(),'keywords'=>$keywords]);}//添加public function getAdd(){//加载模板return $this->fetch("User/add");}//执行添加public function postInsert(){//请求对象$request=request();//获取参数$data=$request->only(['username','email','password']); $data['status']=2;$data['token']=rand(1,10000);// echo "<pre>";// var_dump($data);// echo "111";//验证操作$result=$this->validate($request->param(),'User');if(true!==$result){// echo $result;$this->error($result,'/user/add');}// echo "111";$s=Db::table("users")->insert($data);if($s){$this->success("添加成功",'/user/index');}else{$this->error("添加失败",'/user/add');}}//执行删除public function getDelete(){//获取id//创建请求对象$request=request();$id=$request->param('id');// echo $id;if(Db::table("users")->where('id',$id)->delete()){$this->success("删除成功","/user/index");}else{$this->error("删除失败");}}public function getEdit(){$request=request();$id=$request->param('id');//获取需要修改的数据$info=Db::table("users")->where("id",$id)->find();return $this->fetch("User/edit",['info'=>$info]);}public function postUpdate(){$request=request();//获取参数$data=$request->only(['username','email']);// $data=if(Db::table("users")->where("id",$request->param('id'))->u pdate($data)){$this->success("修改成功","/user/index");}else{$this->error("修改失败","/user/edit");}}}登录<?phpnamespace app\admin\controller;//导入Controlleruse think\Controller;use think\Db;use think\Session;class Login extends Controller{public function getLogin(){//加载模板return $this->fetch("Login/login");}//执行登录public function postDologin(){//获取输入的验证码//创建请求对象$request=request();$fcode=$request->param('fcode');//检测验证码if(!captcha_check($fcode)){$this->error("验证码错误","/adminlogin/login");}else{// echo "111";//检测管理员和密码//获取数据库数据$info=Db::table("admin_users")->where('name',$request->p aram('name'))->find();if(!$info){$this->error("用户名不正确","/adminlogin/login");}else{//检测密码if($info['password']==$request->param('password')){//把用户的信息存储在session里Session::set('islogin',$info['id']);// (1)获取当前登录用户的所有权限信息(当前用户所能访问到的控制器和方法)$node=Db::query("select ,n.mname,n.aname from user_role as ur,role_node as rn,node as n where ur.rid=rn.rid and rn.nid=n.id and uid={$info['id']}");// echo "<pre>";// var_dump($node);exit;// (2)处理权限信息//后台首页权限(每个管理员都拥有)$nodelist['admin'][]="getindex";//如果有add 添加insert 如果有edit 添加update//遍历foreach($node as $v){$nodelist[$v['mname']][]=$v['aname'];//如果有add 添加insertif($v['aname']=="getadd"){$nodelist[$v['mname']][]="postinsert";}//如果有edit 添加updateif($v['aname']=="getedit"){$nodelist[$v['mname']][]="postupdate";}}// echo "<pre>";// var_dump($nodelist);exit;// (3)把当前登录的用户所具有的权限信息(当前用户所能访问到的控制器和方法)存储在session里Session::set('nodelist',$nodelist);// echo "后台首页";$this->success("登录成功","/admin/index");}else{$this->error("密码不正确","/adminlogin/login");}}}}//退出public function getLogout(){//销毁session作用域Session::delete('islogin');$this->success("退出成功","/adminlogin/login");}}文件上传<?phpnamespace app\admin\controller;//导入Controlleruse think\Controller;use think\Db;class File extends Controller{public function getIndex(){//加载模板return $this->fetch("File/index");//执行上传public function postUpload(){//普通上传// $request=request();// //1.获取表单数据// $file=$request->file("image");// //2.移动到项目根目录下// if($file){// // ROOT_PATH 根目录 DS 分隔符全局变量// $info=$file->move(ROOT_PATH.'public'.DS.'uploads');// //后缀// echo $info->getExtension()."<br>";// //文件信息// echo $info->getSaveName()."<br>";// }else{// echo "error";// // $this->error($file->getError(),"/file/index");// }//验证上传$request=request();// //1.获取表单数据$file=$request->file("image");//添加验证规则 validate 验证方法$result=$this->validate(['file2'=>$file],['file2'=>'require|ima ge|fileSize:31456677788888'],['file2.require'=>'请选择上传文件','file2.image'=>'非法图像文件','file2.fileSize'=>'图像大小超出']);//对比if(true!==$result){$this->error($result,"/file/index");//2.移动到根目录下$info=$file->move(ROOT_PATH.'public'.DS.'uploads');//获取savename$savename=$info->getSaveName();// echo $savename;$img=\think\Image::open("./uploads/".$savename);//名字$name=time()+rand(1,10000);//后缀$type=$img->type();//裁剪//$img->crop(100,100)->save("./uploads/"."crop/".$name.".".$typ e);//缩放//$img->thumb(100,100)->save("./uploads/"."crop/".$name.".".$t ype);//翻转// $img->flip()->save("./uploads/"."crop/".$name.".".$type);//旋转// $img->rotate(-90)->save("./uploads/"."crop/".$name.".".$type);//水印//$img->water("./logo.jpg",\think\Image::WATER_NORTHWEST)-> save("./uploads/"."crop/".$name.".".$type);//文字水印//$img->text('sm',"./msyh.ttf",25,"#ffffff")->save("./uploads/"."cro p/".$name.".".$type);// var_dump($img); 可以听见我说话吗}}图片删除Ajax分页php代码<?phpnamespace app\admin\controller;//导入Controlleruse think\Controller;use think\Db;class Article extends Controller{public function getIndex(){//创建数据对象$request=request();//获取数据总条数$tot=Db::table("articles")->Count();// echo $tot;//每页显示的数据条数2$rev=3;//获取数据最大页$sums=ceil($tot/$rev);$pp=array();//循环for($i=1;$i<=$sums;$i++){$pp[$i]=$i;}//获取page$page=$request->get('page');//判断if(empty($page)){$page=1;}//获取偏移量$offset=($page-1)*$rev;//准备sql// {$offset} 数据偏移量 {$rev} 每页显示的数据条数$sql="select * from articles limit {$offset},{$rev}";//判断是否为Ajaxif($request->isAjax()){//执行sql$article=Db::query($sql);//加载模板return $this->fetch("Article/test",['article'=>$article]);// exit;}//执行sql$article=Db::query($sql);//加载模板return$this->fetch("Article/index",['pp'=>$pp,'article'=>$article]);}}html代码:<div class="dataTables_paginate paging_full_numbers" id="">{foreach name="pp" item="row"}<li style="list-style-type:none;width:30px;height:30px;text-align:center;line-height:30px;float:left"><ahref="javascript:void(0)" class="btn btn-info" onclick="page({$row})">{$row}</a></li>{/foreach}</div>js 代码:<script type="text/javascript">function page(page){// alert(page);// alert($);//Ajax$.get("/article/index",{page:page},function(data){// alert(data);//赋值把响应数据赋值给id为uid div$("#uid").html(data);});}</script>Ajax批量删除php代码://Ajax 删除public function getDel(){//接收uname参数$uname=isset($_GET['uname'])?$_GET['uname']:'';if($uname==""){echo "请至少选中一条数据";exit;}//遍历foreach($uname as $key=>$value){if(Db::table("users")->where("id","{$value}")->delete()){}}echo 1;}html代码:<tr><!-- javascript:void(0) 屏蔽a连接的默认行为--><td colspan="7"><a href="javascript:void(0)" class=" btn btn-info allchoose">全选</a><a href="javascript:void(0)" class=" btn btn-info nochoose">全不选</a><a href="javascript:void(0)" class=" btn btn-info fchoose">反选</a></td></tr><tr><td colspan="7"><a href="javascript:void(0)" class="btn btn-success del">删除</a></td></tr>js代码:<script type="text/javascript">//全选$(".allchoose").click(function(){//选中全部的input each JQuery 遍历$("#DataTables_Table_1").find("tr").each(function(){// alert('sss');//获取tr下的input$(this).find(":checkbox").attr("checked",true); });})//全不选$(".nochoose").click(function(){//选中全部的input each JQuery 遍历$("#DataTables_Table_1").find("tr").each(function(){ // alert('sss');//获取tr下的input$(this).find(":checkbox").attr("checked",false); });})//反选$(".fchoose").click(function(){$("#DataTables_Table_1").find("tr").each(function(){ //判断if($(this).find(":checked").attr("checked")){//设置为不选中$(this).find(":checkbox").attr("checked",false);}else{//选中$(this).find(":checkbox").attr("checked",true);}});});//删除$(".del").click(function(){arr=[];//遍历全部的input$(":checkbox").each(function(){//判断选中的inputif($(this).attr("checked")){//获取选中的idid=$(this).val();// alert(id);//push 添加arr.push(id);}})// alert(arr);//Ajax$.get("/user/del",{uname:arr},function(data){// alert(data);if(data==1){// alert("删除成功");if($(":checked").attr("checked")){//遍历arrfor(var i=0;i<arr.length;i++){//获取选中的input$("input[value="+arr[i]+"]").parents("tr").remove(); }}}else{alert(data);}});})</script>图片批量上传<form action="{地址}"method="POST" enctype="multipart/form-data"><input name="image[]"type="file"value="" multiple='multiple' /><input type="submit"value="提交" /></form>import('.UploadFile');$upload=new UploadFile();// 实例化上传类$upload->maxSize =3145728 ;// 设置附件上传大小$upload->allowExts =array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型$upload->savePath ='{本地路径}';// 设置附件上传目录if(!$upload->upload()){ $this->error($upload->getErrorMsg ());die;//输出错误提示}else{ $info=$upload->getUploadFileInfo(); //取得成功上传的文件信息foreach($info as $key=>$value){ $data[$key]['path'] = '{本地路径}'.$value['savename'];//这里以获取在本地的保存路径为例 } }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
自动加载优先级, 上 => 下 高 => 低 类名 行为类 规则 说明 规则1 搜索系统类库目录下面的Behavior目录
规则2 搜索系统扩展目录下面的Behavior目录
规则3 搜索应用类库目录下面的Behavior目录 规则4 如果启用了模式扩展,则搜索模式扩展目录下面的Behavior目录
模型类 规则1 如果启用分组,则搜索应用类库目录的Model/当前分组 目录 规则2 搜索应用类库下面的Model目录
使用PDO 'DB_TYPE' => 'pdo', 'DB_DSN' => 'pdo的dsn', 给$connection 属性赋值, 可以自定义数据库连接信息,中有一些验证功能 data(), 没有验证, 只是简单的赋值.
字段映射 表单名 => 数据库字段 连贯操作 $User->where('status=1')->order('create_time')->limit(10)->select(); 下面这样也行, 等同上面. $User->select(array('order'=>'create_time','where'=>'status=
URL大小写 'URL_CASE_INSENSITIVE' =>true 区分大小写时, 在URL中按文件名大小写来定 有类为 UserType 区分大小写时, URL为: UserType 不区分大小写, URL为: user_type
跨模块调用 $user = A( 'Admin://Tool/User' ) Admin项目的Tool分组的User模块 如果启用分组, 要把分组名给写上, 不然, 貌似不好使啊.
规则3 搜索系统扩展目录下面的Model目录
控制器类 规则1 如果启用分组,则搜索应用类库目录的Action/当前分组 目录 规则2 搜索项目类库目录下面的Action目录
规则3 搜索系统扩展目录下面的Action目录
自定义路径自动加载 'APP_AUTOLOAD_PATH' =>'@.Common,@.Tool', 分组: 项目目录 公共目录 (Common)
参数绑定 在方法中, 可以指定形参数, 这样在程序执行时, 会直接把浏览器传递过来的参数给方法 .
多层控制器, 控制器分层 在TP中, 看着以Actoin结尾实在不爽, 改造, 必须改造 在Common/common.php中, import( '@.Common.Controller' ); 在项目目录下面建一个Common/Controller.class.php 内容为: class Controller extends Action {}
2月3日, TP自学
2013年2月3日 星期日 16:19
类文件都是以.class.php为后缀 在调试模式下面,即使在Windows平台也会严格检查大小写 类名和文件名一致 数据表和字段采用小写加下划线方式命名
行为: 到底是什么? 行为可以说是一个中间接口, 行为中保存了行为的名字, 和这个名字相对应的操作, 当准备执行这个行为的时候, 举例如下: class Behavior { static $callStaticMap = array( 'checkLogin' => 'CheckLoginBehavior' );
用于对查询的group支持 用于对查询的having支持
字符串和数字
字符串 字符串
join* union* lock cache
用于对查询的join支持 用于对查询的union支持 用于数据库的锁机制 用于查询缓存
字符串和数组 字符串、数组和对象
布尔值
distinct 用于查询的distinct支持
URL路由 在项目配置文件中设置, 在分组配置文件中貌似不好使 例如: 'Home/Abc/:m/:a' => 'Home/:1/:2' :1 = :m :2 = :a 正则路由比较不错的说. 在这儿发现PHP正则的一个用法 e 模式
URL生成 在模板中是 {:U( 参数 )} 域名使用: U( 'Blog/read@?username=xxx' );
分区 学习PHP 的第 5 页
$User->select(array('order'=>'create_time','where'=>'status= 1','limit'=>'10')); 连贯操作 作用 支持的参数类型
where table
alias data
用于查询或者更新条件的定义 用于定义要操作的数据表名称(真表名)
惯例配置->项目配置->调试配置->分组配置->扩展配置->动态配置 以上是配置文件的加载顺序,因为后面的配置会覆盖之前的同名配置
配置参数不区分大小写(因为无论大小写定义都会转换成小写) 需要注意的是,二级参数配置区分大小写,也就说读取确保和定义一致。
注意在地址栏中输入控制名的时候的大小写 , 要和文件名的大小写一致.
用于给当前数据表定义别名
字符串、数组和对象 字符串和数组
字符串
用于新增或者更新数据之前的数据对象赋值 数组和对象
field
order limit
用于定义要查询的字段(2参为字段排除) 字符串和数组
用于对结果排序 用于限制查询结果数量 字符串和数组 字符串和数字
page
group having
用于查询分页(内部会转换成limit)
真是麻烦, 把文件名命名规则直接改成全小写, 不就行了, ?还用得着这么麻烦么 想出英文字母区分大小写的人, 真是脑袋被驴踢了.
获得超全局变量 $this -> _get( 名字, 过滤器 ); 这个方法的好处是能过滤数据
分区 学习PHP 的第 4 页
这个方法的好处是能过滤数据 过滤器不写, 会使用 DEFAULT_FILTER 过滤器为false, 不过滤.
2. 'USER' => 'user', //用户配置 3. 'DB' => 'db', //数据库配置 4. ), //加载扩展配置文件 C('ER_AUTH_ID');
单字母大写方法:
A($p) <==> new ($p . Action) ()
B C D
F G
执行行为, 具体意思是? Config 快速实例化自定义模型, 第一参数是表名, 第二参数是 类后缀名, 默认为Model
配置目录 (Conf) Action目录
分组(以Home和Admin分组为例)
不分组
Common/common.php Home分组:Common/Home/function.php Admin分组:Common/Admin/function.php 公共文件:Common/common.php
Home分组:Conf/Home/config.php Admin分组:Conf/Admin/config.php 公共配置:Conf/config.php Home分组:Lib/Action/Home/ Admin分组:Lib/Action/Admin/ 公共Action:Lib/Action/ Conf/config.php
static public function __callStatic( $name, $args ) { if ( isset( self :: $callStaticMap [ $name ] ) ) { $object = new self :: $callStaticMap[ $name ]; call_user_func_array( $object, $args ); } } }
布尔值 支持多个参数
字符串
relation 用于关联查询(需要关联模型支持)
真是他喵的没事找事, 人家Java系统本身就是用点来分隔各个包的, 一味的模仿有毛用啊, 不知道结合实际. PHP决定用\来分割命名空间, 为什么不用这个来做导入类的分割符?
分区 学习PHP 的第 2 页
导入第三方类库 vendor( '类路径.路径. ... .类名' ) 实际上还是调用import了, 不过是把第二个参数如果是空的话 替换成VENDOR常量的值
Home分组:Tpl/Home/theme/ 模板目录 Tpl theme ( 以 主题为例) Admin分组:Tpl/Admin/theme/ 运行时目录(Runtime) Home分组:Runtime/Home/ Admin分组:Runtime/Admin/
分区 学习PHP 的第 3 页
伪静态后缀 如果URL_HTML_SUFFIX为空, 那么任何后缀都可以使用, 如果配置了URL_HTML_SUFFIX的值, 那么只能使用这些配置的值. 'URL_HTML_SUFFIX'=>'(shtml|html|xml)'
Lib/Action/
Lib/Model/ Model 目录 此目录也可以分组, 分组以后, 优先使用分组目录中的类. 语言包目录 (Lang 以zh-cn为例)
Lib/Model/
Lang/zh-cn/common.php Home分组:Lang/zh-cn/Home/lang.php Admin分组:Lang/zh-cn/Admin/lang.php 公共语言包:Lang/zh-cn/common.php Tpl/theme/ Runtime/