thinkphp知识点

ThinkPHP

php框架

真实项目开发步骤:

  1. 多人同时开发项目,协作开发项目、分工合理、效率有提高(代码风格不一样、分工不好)
  2. 测试阶段
  3. 上线运行
  4. 对项目进行维护、修改、升级(单个人维护项目,十分困难,代码风格不一样)
  5. 项目稳定的运行阶段
  6. 项目停止运行(旧项目的人员已经全部离职,新人开发新项目)

问题:

1. 多人开发项目,分工不合理,(html   php   mysql)

2. 代码风格不一样,后期维护十分困难

3. 项目生命周期十分短,项目生命没有延续性,造成资源浪费、人员浪费

4. 项目不能很好适应客户需求,牵一发而动全身。

其他相关框架

1. zendframework   zend php语言公司发布的官方框架,重量级(功能多)

2. yii   美国华人开发的框架,xue qiang, qiang,  重量级框架,纯OOP框架

3. CI  CodeIgniter   轻量级框架,开发速度快,部署灵活

  1. cakephp  外国框架,重量级,速度慢
  2. symfony  外国重量级框架
  3. ThinkPHP 轻量级框架,国人框架,入门容易

什么框架:

一堆代码的集合,里边有变量、函数、类、常量,里边也有许多设计模式MVC、AR数据库、单例等等。

框架可以节省我们50-60%的工作量,我们全部精力都集中在业务层次。

为什么使用框架

l    框架可以帮组我们快速、稳定、高效搭建程序系统

l  该系统由于框架的使用使得本身的维护性、灵活性、适应客户需求方面得到最大化的增强。

l  使用框架的过程中可以使得我们的注意力全部集中业务层面,而无需关心程序的底层架构。

【使用框架】

thinkphp.cn

thinkphp 3.2版本

【框架项目部署】

部署一个Shop项目,使用tp框架

步骤:

创建入口文件:

  1. 在ThinkPHP目录下创建一个入口文件index.php
  1. 访问入口文件的同时系统会自动把对应的应用目录文件Shop创建出来
  1. 打开Home文件夹

【MVC模式】

M:Model 数据模型层,负责数据操作

V:View 视图层,负责显示视图

C:Controller 控制器,实现业务逻辑

【控制器访问及路由解析】

通过url地址get参数找到指定的控制器,并进行对应方法调用请求

http://网址/index.php?m=模块名称&c=控制器&a=方法

以上url地址信息代码不够优雅、不安全。

tp框架url地址可以由以下四种

  1. http://网址/index.php?m=XX&c=XX&a=XX   基本get模式
  2. http://网址/index.php/模块/控制器/操作方法  路径模式pathinfo
  3. http://网址/模块/控制器/操作方法           rewrite重写模式
  4. http://网址/index.php?s=/模块/控制器/方法    兼容模式

具体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地址模式我们学习到了以下内容:

  1. 我们学习到了配置变量(核心配置变量conversion.php、当前应用配置变量config.php)
  2. 快捷函数U(“模块/控制器/方法”)  根据参数和url模式 创建对应的url地址
  3. 把框架的模式调整为开发调试模式

【开发、生产模式】

开发调试模式:系统需要加载大概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:

  1. 在\Shop\Home\Controller文件夹下新建一个控制器文件LoginController.class.php

注意:文件命名规则,按照驼峰法命名

  1. 打开该文件,在里面造控制器Login类
  1. 如果要自定义操作方法,在控制器Login类里面加一个函数Login():

这样我们就完成了控制器和操作方法的建立,如果要访问我们刚才的Login控制器下的Login方法:

  1. 控制器中如果要调用视图层中的模板:

这样再次访问,会发现报错:

原因:模板文件没有创建,这时候我们就要去创建模板文件

【视图模板文件创建】

视图模板文件存放发位置在:

里面没有模板文件

如果我们想要访问Login控制器中的Login方法,首先我们要创建一个Login控制器对应的模板文件夹,该文件夹就对应着Login控制器:

然后在Login文件夹下再创建一个login.html的模板文件来对应Login控制器下的Login方法:

在login.html里面写入要显示的代码:

然后再次请求:

【url地址大小写设置】

默认是不敏感的:

在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([模块/]控制器标志/操作方法)  实例化对象同时调用指定方法

【连接数据库配置及Model数据模型层】

convertion.php

config.php

  1. 在config.php做数据库连接配置
  1. 制作model模型

a)        
model本身就是一个类文件

b)       
数据库中的每个数据表都对应一个model模型文件

c)        
最简单的数据model模型类

  1. 字段缓存设置

tp框架执行过程中会使用到数据表中的字段信息,通过sql语句可以查询”show colums from table”  ,处于性能考虑,可以把字段缓存,避免每次重复执行sql语句。

  1. 可以根据情况对当前的model模型进行个性化设置

实例化Model的三种方式:

  1. $goods =  new  命名空间GoodsModel();
  2. $goods = D(‘模型标志’);

a)        
$goods = D(“Goods”);

b)       
该$goods是父类Model的对象,但是操作的数据表还是sw_goods

c)        
$obj = D();  实例化Model对象,没有具体操作数据表,与M()方法效果一致

  1. $obj = 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范围的记录信息

  1. find()如果我们查询的结果只有一个信息,使用select()会返回一个二维数组

为了使用方便我们会希望返回一个一维数组,这时候可使用find()方法

  1. having()方法设置查询条件,where()设置查询条件

6. 相关聚合函数 count()  sum()   avg()  
max()   min()

以上聚合函数是最后被调用的方法

以上方法可以结合具体条件方法使用

例如:$goods -> where(‘goods_price
>1000’)->count(); 大于1000元的商品的总数目

【数据添加】

add() 该方法返回被添加的新记录的主键id值

两种方式实现数据添加

  1. 数组方式数据添加

$goods = D(“Goods”);

$arr = array(‘goods_name’=>’iphone5s’,’goods_weight’=>’109’);

//注意:goods_name和goods_weight是数据表中字段名称

$goods ->
add($arr);

  1. AR方式实现数据添加

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值返回

【收集表单数据入库操作】

  1. 制作一个表单
  2. 通过$_POST收集信息
  3. 通过create()方法实现数据收集,该方法对于非法的字段会自动进行过滤

注意:一个add控制器实现两个逻辑,一个是打出添加页面,一个是向数据库添加内容

注意:如果是主键值重复,这种错误会导致error()方法不跳转页面直接抛出错误信息,这是新版本问题,如果想要跳转,找到

【数据修改操作】

save()  实现数据修改,返回受影响的记录条数

具体有两种方式实现数据修改,与添加类似(数组、AR方式)

  1. 数组方式

a)        
$goods = D(“Goods”);

b)       
$ar = array(‘goods_id’=>100,‘goods_name’=>’lenovo手机’,’goods_price’=>1200);

c)        
$goods ->where(‘goods_id>50’)-> save($ar);

  1. 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;

}

以上参数表述,如果在请求的时候没有按照规则传递参数,那么当前方法禁止访问。

(除非参数有默认值)

修改商品信息步骤:

  1. 在“修改”按钮处把被修改商品id信息通过get形式传递给upd操作
  2. 在upd方法里边制作形式参数$goods_id,接收服务器给传递的get变量goods_id
  3. 在修改表单里边制作隐藏域goods_id,避免tp框架禁止修改语句执行
  4. 在upd操作方法内部有两个逻辑:展现表单、收集表单

【数据删除及执行原生sql语句】

delete()  返回受影响的记录条数

$goods -> delete(30);   删除主键值等于30的记录信息

$goods -> delete(“10,12,13”);   删除主键值等于10 12 13的三条记录

$goods -> where(“goods_id>60”)->delete()   把符合条件的记录都给删除

执行原生sql语句

  1. 查询语句query()  返回一个二维数组信息
  2. 添加、修改、删除 execute()  返回受影响的记录条数

$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、手机号码、爱好、学历

具体步骤:

  1. 制作表单
  2. 表单form数据通过create()方法收集(验证功能要求我们必须通过create()方法收集数据)
  3. 自定义数据model模型类实现具体验证规则

【tp框架验证码支持使用】

ThinkPHP/Library/Think/Verify.class.php

$verify = new 命名空间Verify();

$verify -> entry();  生成一个验证码

一个单独的方法生成验证码

在模板使用:

验证是否成功:

【Session和Cookie】

tp框架关于session操作(cookie)

//session(name,value, 有效时间)  设置session

//session(name)  获取session

//session(name,null)  删除指定session

//session(null)  清空全部session

【tp框架实现数据分页】

  1. 我们第三方类库放的位置:

当前模块(Home)目录下,模块中的类库命名空间的根都是以模块名命名

ThinkPHP/Library/目录下,根命名空间为ThinkPHP/Library

  1. 2.  ThinkPHP/Library/Think/下面有很多类库供我们使用
  2. 类的命名规则:要有命名空间,类文件名 Page.class.php
  1. 在控制器中实例化分页类使用:

模板页面:

【tp框架扩展函数库】

三个位置:

  1. ThinkPHP/Common/functions.php
  2. 应用/Common/Common/function.php
  3. 模块/Common/function.php

在该文件里面写自定义方法即可

【tp框架文件上传中文乱码问题】

在windows操作系统下:

在ThinkPHP/Library/Think/Upload/Driver/Local.class.php

第83行将$filename 改为 
iconv(‘utf-8‘,‘gb2312‘,$filename)

时间: 2024-10-06 01:45:20

thinkphp知识点的相关文章

学习ThinkPHP框架必须了解的知识点(一)

1.框架:有大量的类.方法.函数按一定的逻辑组成的集合: 2.MVC(Model-View-Controller):即模型-视图-控制器这种编程模式:  M->Model:实体层,它主要是对数据库的操作:每一个Model.cs文件对于一张数据表,和它相应的数据库库操作:  V->View:视图层,可以简单的理解为模板,主要是展示作用:  C->Controller:控制层(控制器),对数据进行分析.过滤:它向上连接视图层,向它提供从数据口读取的数据,向下连接实体层,控制数据的读取.  M

关于ThinkPHP的一点小小知识点的补充

1.首先将模板加载到模板引擎中去,然后模板开始解析(优先级是:首先解析内置函数(就是模板引擎的内置函数),然后在解析定义函数(如ThinkPHP内置的U,F函数)),最后再返回到模  板.  如果在模板中ThinkPHP的内置函数中掺杂着js代码,那么js或者将无法运行,或者进行强制转换:反之,如果在js代码掺杂了ThinkPHP的内置函数中,是可以运行成功的. 2.关于ThinkPHP的分页(ThinkPHP3.2.3):  a.分页类位于ThinkPHP/Library/Think/Page

Thinkphp 零散知识点

一.关于JS和CSS路径问题 1.找路径是从入口文件index.php来找的,而不是从文件本身所在位置来找, 因为我们访问时是访问的入口文件 2.在存放JS和CSS的时候可以放到public文件夹下 3.可以使用标签引入: 3.1 import标签 传统方式的导入外部JS和CSS文件的方法是直接在模板文件使用: 系统提供了专门的标签来简化上面的导入: 3.2 load标签 load标签,通过文件方式导入当前项目的公共JS或者CSS 3.3js和css标签 系统还提供了两个标签别名js和css 用

ThinkPHP基本知识点

下载获取:www.thinkphp.cn 配置 1.创建网站根目录  2.放置thinkPHP框架目录    3.浏览器下访问单入口文件 目录简介 Application ├─Common 应用公共模块 │ ├─Common 应用公共函数目录 │ └─Conf 应用公共配置文件目录 ├─Home 默认生成的Home模块 │ ├─Conf 模块配置文件目录 │ ├─Common 模块函数公共目录 │ ├─Controller 模块控制器目录 │ ├─Model 模块模型目录 │ └─View 模块

Thinkphp简易知识点(二)

1.简述MVC的原理以及单入口模式的好处? 单入口模式的好处:安全,灵活.可集中进行安全处理,访问统计等统一控制. 2.入口文件中为什么要判断PHP版本,TP要求PHP的版本是什么? 因为ThinkPHP3.2引入了命名空间的概念,PHP5.3以上(包含PHP5.3)的版本才支持 PHP版本不能小于5.3.0 3.控制器的定义规则是什么(含控制器名.控制器类名和控制器类文件名),并举出一个例子? 控制器名: 首字母大写.例:Index 控制器类名:控制器名+Controller.例:IndexC

ThinkPHP讲解(一)框架基础

ThinkPHP框架知识点过于杂乱,接下来将以问题的形势讲解tp(ThinkPHP的简写) 1.tp框架是什么,为什么使用是它? 一堆代码的集合,里边有变量.函数.类.常量,里边也有许多设计模式MVC.AR数据库.单例等等.框架可以节省我们50-60%的工作量,我们全部精力都集中在业务层次. 为什么使用框架 框架可以帮组我们快速.稳定.高效搭建程序系统 该系统由于框架的使用使得本身的维护性.灵活性.适应客户需求方面得到最大化的增强. 使用框架的过程中可以使得我们的注意力全部集中业务层面,而无需关

ThinkPHP中的模型

ThinkPHP中的模型 1.什么是模型(Model) 模型表示企业数据和业务规则,实际项目开发中,主要实现与数据库进行操作. 2.模型的定义规则 模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型类的关键词Model,再加上类文件后缀.class.php 案例:实现移动办公自动化系统的组织结构功能 ① 设计数据库db_think ② 设计数据表结构(tk_dept) id ???? 编号 ????int 自动增长 主键 name 部门名称 varchar(4

thinkphp框架中“关联操作”的完整定义详解

在复杂的关联操作中,如果要给关联定义增加可选的属性,我们可以采用完整定义的方式. 完整定义的格式是: protected $_link = array( '关联表名1'  =>  array( '该表的关联方式的属性1' => '定义', '该表的关联方式的属性N' => '定义', ), '关联表名2'  =>  array( '该表的关联方式的属性1' => '定义', '该表的关联方式的属性N' => '定义', ), ... ); 在上面的格式描述中,对于属性我

thinkphp ajax删除 隐藏与显示

知识点: 1.ajax删除: 2.一个同步实现三个异步的效果. html 部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <hea