全新ThinkPHP框架笔记(都是干货)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ThinkPHP学习笔记
【thinkphp的优点】
1.自动加载,动态编译,节约系统效率
2.ajax,视图,分组,权限管理,关联操作,主从数据库,缓存
3.自动验证,自动完成,映射
4.支持4种url解析模式,方便seo
【版本说明】
A: alpha 内部测试
B: beta 公开测试或者给客户进行测试
C: RC 开发倒计时,一般没什么问题
F:final 正式版本
【主入口文件可选配置】
开启调试模式:define(‘APP_DEBUG’,’TRUE’); //将模拟linux操作系统来帮我们识别大小写,而且方法名的大小写与模板文件的大小写相关
定义公共模块的目录,放到应用目录外
define('COMMON_PATH', './Common/');
【url访问规则】
访问模式:
0 普通模式:参数形式
1 pathinfo模式:http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2
智能识别'URL_PATHINFO_MODEL'=>1;
非智能识别:m/模块名/a/方法名'URL_PATHINFO_MODEL'=>1;
2 rewrite重写:伪静态,index.php取消掉
3 兼容模式:http://域名/index.php?s=/user/g
修改方法:
在config.php中,增加配置项:'URL_MODEL'=>1(or 2,3,0);
重写模式要在apache配置中(httpd.conf)开启rewrite,.htaccess(记事本添加可以在保存名字的时候加上双引号)
注:通过url不能执行私有方法,但定义的私有方法的意义体现在可以对该类下的公有方法的验证等相关操作
【配置】
修改url的分隔符:’URL_PATHINFO_DEPR’=>’/’
修改模板定界符:’TMPL_L_DELIM’=>’<{’, ’TMPL_R_DELIM’=>’}>’
开启页面trace :‘show_page_TRACE’=>true,
大C方法:读取配置文件参数,可利于此分配到模板中调用
eg:$a=C('DB_HOST');
【控制器的使用】
1.渲染视图
$this->display():
//参数1:模板,参数2:编码;参数3:类型(xml,txt)
加载其他的控制器下面的模板:$this->display('index:login');
加载其他模板目录的模板:目录名@模块名:模板名
加载自定义路径的模板:直接写全相对路径和模板名(加上后缀),以主入口文件为相对位置
2.参数传递
C:$this->assign(‘data’,$name);
V:hello {$data} //动态数据的输出,{}为默认定界符
3.跳转:
// 操作完成3秒后跳转到/Article/index
$this->success('操作完成','你的路径',3);
// 操作失败5秒后跳转到/Article/error
$this->error('操作失败','/Article/error',5);
4.重定向:
$this->redirect('New/category', array('cate_id' => 2), 5, '页面跳转中...');
5. 安全获取用户数据:
I('post.');
I('ername') ==== $_POST['username']
6.生成url
U('url路径',array()) //array传递参数
U('index/test',array('id'=>10))
7.关于空操作:
防止黑客不断的请求网站的各种页面,通过一些错误信息来判断网站的框架,编写语言以及数据库类型等信息,不利于网站的安全
用处:实现错误页面和一些URL的优化
php原生处理方式:
魔术方法:__call($method,$arg){echo '您操作的方法不存在'}; //参数:方法,参数Thinkphp处理方式:_empty(){}
8.关于跨模块操作:
A("") //实例化控制器对象
R("模块/控制器/操作") //实例化控制器对象并调用相关方法
【常量相关】
系统常量:
__ROOT__ // 项目根目录地址
__APP__ //当前项目的入口文件地址
__URL__ //当前模块地址
__SELF__ /当前url地址
自定义常量:
在相应的配置文件进行如下配置:
'TMPL_PARSE_STRING'=>array(
'__A__'=>'qawedad',
'__B__'=>'asdasda'
)
【关于视图层】
1.数组的遍历:
<volist name=’data’ id=’vo’>
<{$vo.id}>|<{$ername}> 得到数组的值
</volist>
2.模板url替换
{:U('模块/控制器/方法',array('key'=>'value'))} 会自动为你生成一个url
__MODULE__/控制器/方法/参数===等价于/index.php/模块名__APP__/模块/控制器/方法/参数===等价于/index.php/模块/控制器/方法/参数
__URL__/方法/参数==== 等价于/index.php/module/controller/方法
__ROOT__ /模块/控制器/方法/参数
3. css/ js/ image加载
(1). 传统方法:
<script type='text/javascript' src='/Public/Js/Util/Array.js'>
<link rel="stylesheet" type="text/css" href="/App/Tpl/default/Public/css/style.css" />
(2). import 方法
(3) load 方法
<load href="/Public/Js/Common.js" />
<load href="/Public/Css/common.css" />
(4).js/css标签
<js href="/Public/Js/Common.js" />
<css href="/Public/Css/common.css" />、
4.视图文件的路径以所加载视图的控制器的路径为相对路径,所以视图中加载css/js/images 的路径需要使用以项目根目录开始的绝对路径
eg:/thinkphp/public/css/style.css
/开始:绝对路径
./ :项目目录,文件本身所在目录的上级目录
../ :上级目录
路径的封装:将所用到的路径定义为一个常量,然后再视图中调用
查看当前控制器可以使用的常量:get_defined_const();
调用配置常量:{$Think.const.CSS_PATH}
模板引擎Smarty
编号输出:{$v@iteration}
日期处理:{$v.time|date_format:"%Y-%I-%d %H:%M:%S"} //变量调节器
【数据库配置】
方法一:
‘DB_TYPE’=>’mysql’, //数据库抽象层的选择
‘DB_HOST’=>’localhost’,
‘DB_NAME’=>’thinkphp’,
‘DB_USER’=>’root’,
‘DB_PWD’=>’’,
‘DB_POST’=>’3306’
‘DB_PREFIX’=>’tp_’, //表前缀
方法二:DSN方式
‘DB_DSN’=>’mysql://root:@localhost:3306/thinkphp’, //优先级高于方法一
‘DB_PREFIX’=>’tp_’, //表前缀
主从数据库的配置
'DB_DEPLOY_TYPE'=>1,
'DB_HOST'=>'192.168.1.1,localhost',
'DB_NAME'=>'tp,thinkphp',
读写分离
'DB_RW_SEPARATE'=>true //自动将第一台数据库做写入的数据库,后面的数据库作为读的数据库
'DB_FILES_CACHE' 字段缓存
【模型的使用:】
获取不同表前缀的名字:protected $truename;
对于多服务器的情况,怎么修改表字段:
protected $fields=array(
0=>'id',
1=>'username',
2=>'password',
'_pk'=>'id', //主键(系统将主键默认为id)
'_aotoinc'=>true //自增
)
跨同服务器的数据库
protected $dbName='';
D(); thinkphp 实例化模型类的方法
M();
thinkphp中的M 和D 的区别是什么?
M() 是model() 的快捷键方式该方法将自己实例化表对象不需要创建表的模型类
D() 是快速创建模型类实现表对象的快捷方法,使用D() 必须在你的model层创建相应的表模型类
模型实例化:
1.$goods= new GoodsModel(); //实例化继承了model基类的个性化需求模型类
2. $goods = D('goods'); //快捷函数:和1方法等同
$goods = D(); //创建model基类对象,相当于一个数据库的链接,去执行原生sql语句
3.$goods = M('goods'); //创建基类model对象,操作goods数据表
数据查询
1.find
2.select
group(分组) order(排序) distinct(去掉重复) //自动调用的方法(魔术方法/空方法)
3.getByXxxx('aa') //查询字段xxxx的值为aa的,也是自动调用的方法
4.条件having 和where
having是在where的基础上进行二次筛选,
having对查询的字段进行筛选,where对表中的字段进行筛选
having可以和聚合函数一起使用(sum count max)
5.表单数据收集:create
【缓存】
把数据库信息获取出来,放在一个缓存介质里边,重复的数据就从缓存中读取
缓存介质:内存、file文件、数据库
读写方法:
memcache内存缓存get() set()
file文件缓存: fopen() fwrite()
db数据库: insert() select()
ThinkPhp封装的方法: S(name) S(name,value)
thinkphp缓存
默认:文件缓存S('name',value,time) //time 单位为秒,不设置默认为永久,缓存文件可以看到缓存时间
清除缓存S('name',null)
【自动完成】
对表单信息的处理,比如密码加密,获取时间,数据存入数据库create()方法
【自动映射】
表单映射到数据库字段
注:三大自动分别是自动完成,自动加载,自动映射
【权限管理】
角色的意义:对权限打包,方便权限分配
表的设计:
user表:user_id,role_id
权限表(菜单表)node:
权限id node_id
父权限id node_pid
控制器controller
方法action
全路径url
级别level
角色表role:
角色id role_id
权限ids node_ids
查询思路:用户表查角色id 通过角色id查找权限
$sql="select b.node_ids from user a join role b on a.role_id=b.role_id where er_id=".$_SESSION['user_id']
查找一级权限
$sql="select * from node where node_level=0";
if($_SESSION['id']!=1){
$sql.=" and node_id in (node_ids) ";
}
查找下级权限
$sql=" select * from node where node_level=1";
if($_SESSION['id']!=1){
$sql.=" and node_id in (node_ids) ";
}
遍历思路:
循环一级菜单变量,然后循环二级菜单变量pid=一级菜单变量id的项
url权限控制:写一个父类,然后对当前控制器及方法与用户权限表进行对应。

相关文档
最新文档