thinkphp知识点
2021-07-04 15:03
标签:速度慢 覆盖 gb2312 灵活 大小写 entry tin 配置 limit php框架 真实项目开发步骤: 问题: 1. 多人开发项目,分工不合理,(html php mysql) 2. 代码风格不一样,后期维护十分困难 3. 项目生命周期十分短,项目生命没有延续性,造成资源浪费、人员浪费 4. 项目不能很好适应客户需求,牵一发而动全身。 其他相关框架 1. zendframework zend php语言公司发布的官方框架,重量级(功能多) 2. yii 美国华人开发的框架,xue qiang, qiang, 重量级框架,纯OOP框架 3. CI CodeIgniter 轻量级框架,开发速度快,部署灵活 什么框架: 一堆代码的集合,里边有变量、函数、类、常量,里边也有许多设计模式MVC、AR数据库、单例等等。 框架可以节省我们50-60%的工作量,我们全部精力都集中在业务层次。 为什么使用框架 l 框架可以帮组我们快速、稳定、高效搭建程序系统 l 该系统由于框架的使用使得本身的维护性、灵活性、适应客户需求方面得到最大化的增强。 l 使用框架的过程中可以使得我们的注意力全部集中业务层面,而无需关心程序的底层架构。 thinkphp.cn thinkphp 3.2版本 部署一个Shop项目,使用tp框架 步骤: 创建入口文件: M:Model 数据模型层,负责数据操作 V:View 视图层,负责显示视图 C:Controller 控制器,实现业务逻辑 通过url地址get参数找到指定的控制器,并进行对应方法调用请求 http://网址/index.php?m=模块名称&c=控制器&a=方法 以上url地址信息代码不够优雅、不安全。 tp框架url地址可以由以下四种 具体url地址模式设置(配置文件ThinkPHP/Conf/convertion.php) URL_MODEL
= 0/1/2/3 分别代表四种url地址模式 config.php是我们当前自己项目的配置文件,我们可以通过修改该文件达到配置变量的目录 这个文件在系统运行过程中会覆盖convertion.php的配置变量 include “convertion.php”; include “config.php”; 后引入的文件要把先引入的文件配置变量给覆盖掉 我们系统有兼容4中url地址模式的使用 系统有的时候会自动创建url地址,它会根据当前模式进行url地址创建使用 快捷函数 U(); 创建url地址 通过url地址模式我们学习到了以下内容: 开发调试模式:系统需要加载大概24个文件 index.php
define(“APP_DEBUG”,true); 生产模式:系统只需要加载很少的大概7个文件 在入口文件 index.php中定义: define(“APP_DEBUG”,false); 节省了许多文件的开发、关闭的系统开销,节省资源 要在页面显示trace信息,需要在自己的配置文件中: 控制器是MVC模式中的核心,tp默认有一个Index控制器: Index控制器里面有一个操作方法:Index 我们在访问http://localhost:8080/Thinkphp/index.php入口文件的时候,会默认访问Index控制器下面的Index方法 如果要自己创建一个控制器Login: 注意:文件命名规则,按照驼峰法命名 这样我们就完成了控制器和操作方法的建立,如果要访问我们刚才的Login控制器下的Login方法: 这样再次访问,会发现报错: 原因:模板文件没有创建,这时候我们就要去创建模板文件 视图模板文件存放发位置在: 里面没有模板文件 如果我们想要访问Login控制器中的Login方法,首先我们要创建一个Login控制器对应的模板文件夹,该文件夹就对应着Login控制器: 然后在Login文件夹下再创建一个login.html的模板文件来对应Login控制器下的Login方法: 在login.html里面写入要显示的代码: 然后再次请求: 默认是不敏感的: 在config.php里边对url大小写敏感进行设置 空操作:就没有指定的操作方法 空控制器:没有指定控制器 http://网址/index.php/Home/User/login http://网址/index.php/Home/User/hello 空操作 http://网址/index.php/Home/beijing/login 空控制器 一般网站处于安全考虑不给用户提示任何错误信息 “空操作”本质意思:一个对象(控制器)调用本身不存在的方法 在OOP里边,对象调用本身不存在方法,处于用户体验比较好的角度考虑,我们可以在类里边制作一个魔术方法:function __call(); 在tp里面控制器的父类: 父类中有个方法: 所以空操作有两种解决方案: ①
在对应的控制器里边制作一个方法,名称为”_empty”,这个控制器的空操作都会自动执行该方法。(推荐使用) ②
给空操作的名称制作一个同名的模板出来,系统会自动调用 空控制器:在实例化控制器对象的时候,没有找到指定的类 什么时候实例化控制器对象: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()方法即可。 这样再次请求: 系统有前台用户操作界面 系统还有后台供公司内部人员使用维护平台 两者在使用的过程中就是对“控制器”、“视图模板”、“model模型”的操作 为了系统开发方便,及代码部署更加合理,我们的控制器、view视图等前后台文件不要混在起,要在物理结构上给分开 http://网址/index.php/Home/控制器/操作方法 访问Home控制器及制定操作 http://网址/index.php/Admin/控制器/操作方法 访问Admin分组的控制器和操作方法 获取系统常量信息: 如果加参数true,会分组显示: 一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法。 跨控制器调用可以节省我们代码的工作量 在Main控制器中有一个Info操作方法 想要在其它控制器,比如Login中调用,我们可以实例化控制器对象,调用里面的方法即可: 造对象有快捷函数供我们使用: A(“[模块/]控制器标志”) 实例化控制器对象 R([模块/]控制器标志/操作方法) 实例化对象同时调用指定方法 convertion.php config.php a)
model本身就是一个类文件 b)
数据库中的每个数据表都对应一个model模型文件 c)
最简单的数据model模型类 tp框架执行过程中会使用到数据表中的字段信息,通过sql语句可以查询”show colums from table” ,处于性能考虑,可以把字段缓存,避免每次重复执行sql语句。 实例化Model的三种方式: a)
$goods = D(“Goods”); b)
该$goods是父类Model的对象,但是操作的数据表还是sw_goods c)
$obj = D(); 实例化Model对象,没有具体操作数据表,与M()方法效果一致 a)
实例化父类Model b)
可以直接调用父类Model里边的属性,获得数据库相关操作 c)
自定义model就是一个空壳,没有必要实例化自定义model d)
$obj = M(‘数据表标志’); 实例化Model对象,实际操作具体的数据表 $obj = D(标志); $obj = D(); $obj = M(标志); $obj = M(); D()和M()方法的区别: 前者是tp3.1.3里边对new操作的简化方法; 后者在使用就是实例化Model父类 两者都在函数库文件定义ThinkPHP/Common/functions.php 注意:如果没有对应的model模型文件类,也可以直接实例化model对象进行操作 D()和M()方法都可以实例化操作一个没有具体model模型类文件的数据表。 select()是数据模型的一个指定方法,可以获得数据表的数据信息 返回一个二维数组信息,当前数据表的全部数据信息 $obj = D();
创建对象 $obj -> select(); 查询数据 select
字段,字段 from 表名
where 条件 group 字段 having 条件
order 排序 limit 限制条数; SELECT%DISTINCT%%FIELD%FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT%
%UNION%%COMMENT% $obj -> field(字段,字段); 查询指定字段 $obj -> table(数据表); 设置具体操作数据表 $obj -> where(参数); 参数就是正常sql语句where后边的条件信息 例如:( “goods_price >100 and goods_name like ‘三%’”) $obj -> group(字段);
根据字段进行分组查询 $obj -> having(参数条件); having 条件设置 $obj -> order(‘price desc/asc’)
排序查询 $obj -> limit([偏移量,]条数) 限制查询的条数 sql语句里边具体的条件设置在tp框架model模型里边体现为具体的方法操作 以上方法理论上是父类Model的对应方法 父类model具体存在方法: field() where()
limit() 还有一些方法在__call()自动调用函数里边:
table() group() order()
having() 在__call()魔术方法里边会判断当前的执行方法是否是一个method属性的元素信息,如果存在就会执行执行 以上多个方法是同时使用多个进行条件显示(并且没有顺序要求) $obj -> limit(5)->field(‘id,name’)->order(‘price
asc’) -> table(‘sw_goods’)->select(); 以上许多方法执行没有顺序要求,许多方法执行后都是把具体的参数赋予到model属性options里边,最后根据options拼装sql语句。 $info = $goods -> where()->field(字段)->select(); select()方法 1. 返回一个二维数组信息 2. 返回全部数据表信息 3. 给该方法传递参数 a)
select(30) 查询主键值等于30的记录信息 b)
select(“10,12,14”) 查询主键值在10、12、14范围的记录信息 为了使用方便我们会希望返回一个一维数组,这时候可使用find()方法 6. 相关聚合函数 count() sum() avg()
max() min() 以上聚合函数是最后被调用的方法 以上方法可以结合具体条件方法使用 例如:$goods -> where(‘goods_price
>1000’)->count(); 大于1000元的商品的总数目 add() 该方法返回被添加的新记录的主键id值 两种方式实现数据添加 $goods = D(“Goods”); $arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’); //注意:goods_name和goods_weight是数据表中字段名称 $goods ->
add($arr); a)
ActiveRecord 活跃记录 b)
AR规定了程序与数据库之间的关系 c)
什么是AR: d)
① 一个数据表对应一个类model e)
② 一条数据记录对应类的一个对象 f)
③ 每个字段对应该对象的具体属性 g)
tp框架的AR是假的 $goods = D(“Goods”); $goods ->
goods_name = “htc_one”; $goods ->
goods_price = 3000; $goods ->
add(); 以上两种方式:数组、AR,最后add都要把新记录的主键id值返回 注意:一个add控制器实现两个逻辑,一个是打出添加页面,一个是向数据库添加内容 注意:如果是主键值重复,这种错误会导致error()方法不跳转页面直接抛出错误信息,这是新版本问题,如果想要跳转,找到 save() 实现数据修改,返回受影响的记录条数 具体有两种方式实现数据修改,与添加类似(数组、AR方式) a)
$goods = D(“Goods”); b)
$ar = array(‘goods_id’=>100,‘goods_name’=>’lenovo手机’,’goods_price’=>1200); c)
$goods ->where(‘goods_id>50’)-> save($ar); a)
$goods = D(“Goods”); b)
$goods ->
goods_id = 53; c)
$goods -> goods_name = “三星手机”; d)
$goods -> goods_price = 2000; e)
$goods -> where(‘goods_price>10000’)->save(); 以上两种方式如果可行,即要修改全部数据 以上sql语句从技术上可行,从业务上不可行(事故) tp框架有智能考虑,以上情况的sql语句不被允许执行。 如何执行: ① 明确告诉系统那条sql语句被update更新 ② 可以设置where进行sql语句更新操作 save()
方法返回值 0:之前没有问题,执行前后数据没有变化 自然数:受影响的记录条数 false:执行失败 数据修改具体实现: 通过路由给一个操作方法传递参数 http://网址/index.php/模块/控制器/方法upd/变量名1/值/变量名2/值/变量名3/值 以上路由是通过get形式给指定的操作传递了三个参数信息 $_POST方式也可以 原则三个参数信息接收的时候通过$_GET接收即可 例如:$_GET[‘变量名1’]; 以上参数信息接收太直白,不安全,需要按照框架规则使用下边的方式接收get参数信息 http://网址/index.php/Admin/Goods/upd/name/tom/age/25/addr/beijing function upd($name,$age,$addr){ $name; $age; $addr; } 以上参数表述,如果在请求的时候没有按照规则传递参数,那么当前方法禁止访问。 (除非参数有默认值) 修改商品信息步骤: delete() 返回受影响的记录条数 $goods -> delete(30); 删除主键值等于30的记录信息 $goods -> delete(“10,12,13”); 删除主键值等于10 12 13的三条记录 $goods -> where(“goods_id>60”)->delete() 把符合条件的记录都给删除 $goods = D(“Goods”); $sql = “select *
from sw_goods”; $rst = $goods
-> query($sql); $sql = “select
goods_category_id,avg(goods_price) from sw_goods group by goods_category_id
having avg(goods_price)>1000”; $goods -> query($sql); $sql = “update
sw_goods set goods_name = ‘htc_two’ where goods_id=100”; $goods -> execute($sql); javascript jquery
在服务器端通过tp框架实现表单验证 用户名、密码、重复密码、邮箱、qq、手机号码、爱好、学历 具体步骤: ThinkPHP/Library/Think/Verify.class.php $verify = new 命名空间Verify(); $verify -> entry(); 生成一个验证码 一个单独的方法生成验证码 在模板使用: 验证是否成功: tp框架关于session操作(cookie) //session(name,value, 有效时间) 设置session //session(name) 获取session //session(name,null) 删除指定session //session(null) 清空全部session 当前模块(Home)目录下,模块中的类库命名空间的根都是以模块名命名 ThinkPHP/Library/目录下,根命名空间为 模板页面: 三个位置: 在该文件里面写自定义方法即可 在windows操作系统下: 在ThinkPHP/Library/Think/Upload/Driver/Local.class.php 第83行将$filename 改为
iconv(‘utf-8‘,‘gb2312‘,$filename) thinkphp知识点 标签:速度慢 覆盖 gb2312 灵活 大小写 entry tin 配置 limit 原文地址:http://www.cnblogs.com/du892294464/p/7110331.htmlThinkPHP
【使用框架】
【框架项目部署】
【MVC模式】
【控制器访问及路由解析】
【开发、生产模式】
【控制器和对应方法创建】
【视图模板文件创建】
【url地址大小写设置】
【空操作和空控制器处理】
空操作:
空控制器:
【项目分组】
【系统常量信息】
【跨控制器调用】
【连接数据库配置及Model数据模型层】
【数据查询】
【数据添加】
【收集表单数据入库操作】
【数据修改操作】
【数据删除及执行原生sql语句】
执行原生sql语句
【表单验证】
【tp框架验证码支持使用】
【Session和Cookie】
【tp框架实现数据分页】
ThinkPHP/Library
2.
在ThinkPHP/Library/Think/
下面有很多类库供我们使用
【tp框架扩展函数库】
【tp框架文件上传中文乱码问题】