文件夹及文件【控制器,模型】命名才用驼峰法[首字母大写]
URL:
url访问方式:
index.php?m=home&c=index&a=abc
m:模块; 默认模块是home
c:控制器;默认控制器是index
a:方法。 默认方法是index
tp采用的是单入口文件!
tp3.2.3版本中支持以下4种格式。其中有2种是最最重要。
URL模式 URL_MODEL设置
普通模式 0
PATHINFO模式 1 [标准] =============重要。
REWRITE模式 2
兼容模式 3
配置文件中:’URL_MODEL’=>1, //0:普通模式;1:pathinfo模式【默认的】
I(‘post.’) //所有的值
I(‘post.name’)
I(‘get.’) //所有的值
I(‘get.name’)
get方式传值:
index.php?m=home&c=news&a=newslist&abc=1&cde=2
index.php/home/news/newslist/?abc=1&cde=2
index.php/home/news/newslist/abc/1/cde/2
get方式取值:
方法一:
$_GET[‘abc’];
方法二:
I(‘get.’);数组类型
I(‘get.变量名’); 得到的就是具体的变量值
视图的渲染:
$this->display(‘/视图文件名’);//注意没有扩展名
格式:$this->display(‘/视图文件名’); //找View视图文件夹下的 视图文件名
============================================
格式:$this->display(‘视图文件名’); //默认找View视图文件夹下,和控制器同名的文件夹中的视图文件名
如何定义模板变量且赋值?
{$xdw}
针对数组的定义和引用!
控制器文件code:
$arr=array(‘a’=>2,’b’=>3,’c’=>4);
$this->assign(“xdw”,$arr);
视图文件code:
{$xdw.b} 或者 {$xdw[‘b’]} //比smarty更智能。
tp3.2.3视图中,如何循环数组?
<foreach name=”xdw” item=”vo” key=”k” >
{$k}|{$vo} <br/>
</foreach>
提示:xdw 就是定义的模板变量名,vo就是循环值,k就是索引下标值或键名。
===========================================
在视图文件中,如何调用系统函数和自定义函数?
调用系统函数:
1、系统函数;
格式如:{$list.abc|substr=1,1}
或 {$list.abc|substr=###,1,1}
提示:若###省略,则把对应的变量值做为第一个参数值传递。
2、自定义函数
a、在哪里定义
函数可以放到
ThinkPHP\Common\functions.php
或
ThinkPHP\ThinkPHP.php
b、如何引用 借鉴 系统函数引用方法。
==========================================
数据库如何操作?
tp3.2.3中配置文件有2种类型;1、全局配置文件;2、模块配置文件。
1、全局配置文件:
App\Common\Conf\config.php 有效于全部模块
2、模块配置文件:
App\Home\Conf\config.php 仅有效于当前模块
增、删、改、查
$obj=M();//若用query方法执行一个完整的sql,则这里可以M()。
$arr=$obj->query(“select * from obj_liuyan_cs”);
print_r($arr);
查:
增加:
$obj=M(“表名”);
$obj->add($arr);//返回值是增加后的主索引值,如:id值。
修改::==============================================
return $obj->where($where)->save($arr);//返回的值是实际更新的记录数。
删除::==============================================
return $users->where($where)->delete();//返回值是删除的真实记录数。
查询:
$obj=M(‘表名’);
$obj->query($sql); //$sql为完全自定义的sql。
$users=M(“ceshi”);
$arr=$users->where(“id=2”)->find();//结果是1维数组;只能是一条。
$arr=$users->where(“id=2”)->select();//结果是2维数组;
多表查询格式,也可以套用到单表中。
$rs=$obj->table(‘users u’)
->field(‘u.id,u.username’)
->order(‘id desc’)
->where()
->limit(1,1)
->select();
===============================
左右连接,子查询:
$obj=M();
$rs=$obj->table(‘users u’)
->field(‘u.sfzid,c.cardnum,(select pay from pays where cardid=c.id) as pay’)
->join(‘left JOIN cards as c ON c.uid=u.id’)
->select();
==================2018/1/10
php开发中,有3类元素是不可以重名的。
1、常量;
2、方法【函数】;
3、类。
命名空间:1、全局空间;2、子空间
命名空间就是帮助我们解决重名问题!
在php中如何声明命名空间呢?
我们可以用namespace来定义命名空间。
注意:namespace前方不可以有输出,否则报错!
page.php code:
function abc(){
echo ‘2’;
}
=========================
include(“page.php”);
function abc(){
echo ‘1’;
}
结果报错,提示重复定义abc();
我们可以在开头定义命名空间,如下:
namespace a;
include(“page.php”);
function abc(){
echo ‘1’;
}
这就不会报错了,原因是,page.php被include包含进来,page.php中的内容在全局空间中。
namespace a;
include(“page.php”);
function abc(){
echo ‘1’;
}
若
abc();//结果是1,默认执行的是当前命名空间里的方法。
如果要执行全局空间的,怎么办?
\abc();//结果是2
访问当前命名空间元素有2种方式:
方式一:直接引用,如abc();
方式二:完整路径引用,如\a\abc();
我们可以声明命名空间的时候,进行多级创建。
如 namespace a\a1;
完整的引用路径:\a\a1\abc();
注意:namespace 一定要放在页面开头,前方不可以有任何的输出!
命名空间中常量特殊!
需要用const 定义。
=====================================
导入类到命名空间中的顺序:
include(“page.php”);
use xdw3;
================================
一个页面中可以定义多个命名空间的!!
namespace xdw\xdw1{
}
namespace xdw\xdw2{
}
提示::一个页面中若定义了多个命名空间,则{}之外不可以有任何代码的执行。
tp3.2.3框架中如何创建模型及如何使用?
创建模型的方法:
页面命名:UsersModel.class.php
内容如下:
namespace 模块名\Model;
use Think\Model;
class UsersModel extends Model {
public function index(){
echo 1234;
}
}
模型在控制器中的引用:
方法一:
$obj=new \模块名\Model\UsersModel(…)
$obj->index();
或
$obj=new \模块名\Model\UsersModel
$obj->index();
方法二:
先导入,后直接实例化:
use \Admin\Model\UsersModel;
$obj=new UsersModel();
$obj->index();
提示:模型的命名即表名,配置的默认库中要有这个表才可以。否则会报错的。因为模型存在的意义就是对表的操作。表都没有,创建模型有啥意义呢?
模型中主要是进行值的返回!输出动作在控制器里操作!
切记:模型不可以直接被访问,只能通过控制器间接的访问操作。
V
C
M
项目构架!
项目中一般分前端模块[Home]和后端模块[Admin]
__PUBLIC__
表单提交的动作页面,不推荐使用:
?m=admin&c=index&a=checklogin
也不推荐使用
/admin/index/checklogin
{:U(‘admin/index/checklogin’)}
admin:模块名;
index:控制器名;
checklogin:方法名。
I(“post.”);
tp中内置的页面跳转方法:
$this->success(‘success’, U(‘index/succ_page’),$time);
$this->error(‘error’, U(‘index/index’),$time);
提示:$time的单位是秒。
$time可省略,若省略,则调用默认时间。
默认success时间是 1s;error时间是3s。
9:21 2018/1/11
U方法可以传递参数:
{:U(‘index/page?filename=pass&t=2’)}
取值:
方法一【内置自动取值,函数参数名和U传递过来的变量名一致】:
function page($filename,$t){
echo $filename;
}
方法二【手动通过I(‘get.’)取值】
function page(){
echo I(“get.filename”);
}
tp3.2.3中用户信息的跟踪【会话机制】
session在tp3.2.3中默认已经开启了,所以不需要再次开启。
可直接使用
$_SESSION[‘session名’]=值;
tp3.2.3中,内置了session处理。
定义:
session(‘name’,’value’); //设置session
取值:
$value = session(‘name’);
删除单个:
session(‘name’,null); // 删除name
删除所有:
session(null); // 清空当前的session
MODULE_NAME 当前模块名
CONTROLLER_NAME 当前控制器名
ACTION_NAME 当前方法名
========================================
tp3.2.3中使用框架验证码。
使用方法,打开手册,搜索验证码。
1、
复制
$Verify = new \Think\Verify();
$Verify->entry();
到我们自定义的控制器方法中。
如下:
//生成验证码
function CreateYzm(){
$Verify = new \Think\Verify();
$Verify->entry();
}
2、
使用
打开对应的视图文件,如login.html
{:U(‘index/CreateYzm’);}把这个作为src的属性值。
3、
判断正误
使用内置方法进行判断。
// 检测输入的验证码是否正确,$code为用户输入的验证码字符串
function check_verify($code, $id = ”){
$verify = new \Think\Verify();
return $verify->check($code, $id);
}
在对应的控制器中使用此方法判断正确true与失败false
$this->check_verify(‘表单传值’);
实现登录页面刷新验证码技术:::
document.getElementById(‘imgyzm’).src=”yzm.php?”+new Date().getTime();
onclick=”this.src=this.src+’?'”
我们如何使用自己定义类的验证码呢?
1、自定义类为切入点。【怎么定义自定义类】
www\tp1214\ThinkPHP\Library\Think
创建一个文件,格式 类名.class.php
类文件内容格式:
namespace Think;
class Yzm{
function CreateImg(){
echo 666;
}
}
验证码有2种解决方案。
1、tp内置验证码技术
2、diy验证码技术。
2、如何使用自定义类。
提示:若我们在登录页面对应的控制器中设置了防跳墙方法。则对应的方法如:【index,验证码方法,判断登录方法】要进行过滤。
9:03 2018/1/12
提示:tp项目开发中,建议:每一个功能块都对应一个控制器。
修改密码流程:
1、/*判断2次输入的新密码一致*/
2、//新密码和老密码不能一样
2.1 判断时间
3、/*要先判断老密码输入正确后,才能进行新密码的修改。*/
扩展:我们需要实现一个功能,如:1天内最多只允许修改3次
密码。
select unix_timestamp();得到当前的时间戳的。
select count(id) as cc from obj_users_log where uid=1 and type=2 and unix_timestamp(updatetime)>(unix_timestamp()-3600*24)
========================================
tp3.2.3中分页类的使用。
$obj=M(‘users’);
$num=3;
$count=$obj->count();
$Page= new \Think\Page($count,$num);
分页样式的修改:
$arr=$obj->order(‘id desc’)->limit(“$Page->firstRow,$Page->listRows”)->select();
$Page->setConfig(‘prev’,’上一页’);
//一定要放到$Page->show();之上才有效!
$Page->setConfig(‘next’,’下一页’);
$show= $Page->show();// 分页显示输出
$this->assign(‘show’,$show);
$this->assign(‘arrlist’,$arr);
$this->display(“/list”);
搜索分页:
注意事项:
$arra[‘keywords’]=$keywords;
//$Page->parameter=$arra; //$Page->parameter,放到show之上
$Page->parameter = array_map(‘urlencode’,$arra); //若不这样,搜索的时候若有’将报错的。
$show= $Page->show();// 分页显示输出
完整sql:
select count(a.id) from obj_users_group_role a,obj_users_role b where a.groupid=2 and b.mokuai=’Admin’ and b.kongzhiqi=’Users’ and b.fangfa=’index’ and a.roleid=b.id
echo “模块名是:”.MODULE_NAME.”控制器是:”.CONTROLLER_NAME.”方法是:”.ACTION_NAME;
select a.*,b.groupid from obj_users_role a left join obj_users_group_role b on a.id=b.roleid
魔术方法:
function _empty(){
echo ‘errordddddddddd’;
}
EmptyController.class.php 空控制器执行文件。
tp3.2.3视图中条件的判断:
<if condition=”$v.groupname eq ” “>无分组<else />{$v.groupname}</if>
<if condition=”($name eq 1) OR ($name gt 100) “>
value1
<elseif condition=”$name eq 2″/>value2<else /> value3
</if>
在condition属性中可以支持eq等判断表达式,同上面的比较标签,但是不支持带有”>”、”<”等符号的用法,因为会混淆模板解析,所以下面的用法是错误的:
<if condition=”$id < 5 “>value1
<else /> value2
</if>
必须改成:
<if condition=”$id lt 5 “>value1
<else /> value2
</if>
tp3.2.3中借助大 U方法传递参数:如:id
<?php echo U(‘users/del/?id=’.$v[‘id’]);?>
或者 <?php echo U(‘users/del?id=’.$v[‘id’]);?> 多个参数用&分割
<a class=”button border-red” href=”<?php echo U(‘users/del/?id=’.$v[‘id’]);?>” ><span class=”icon-trash-o”></span> 删除</a>
tp3.2.3中的缓存:
支持的缓存类型众多,常见常用的文件缓存设置方式:
1、页面静态缓存;
全局配置中
'HTML_CACHE_ON' => true, // 开启静态缓存
'HTML_CACHE_TIME' => 60, // 全局静态缓存有效期(秒)
'HTML_FILE_SUFFIX' => '.html', // 设置静态缓存文件后缀
'HTML_CACHE_RULES' => array( // 定义静态缓存规则
// 定义整个Users控制器 生成的路径App/html/Users/ html会自动生成
'Users:' => 'Users/{:action}_{id}',
)
参考:https://www.cnblogs.com/chinalorin/p/5855254.html
2、局部数据缓存
会按照缓存初始化时候的参数进行缓存数据,也可以在缓存设置的时候改变参数,例如:
// 缓存数据300秒
S(‘name’,$value,300);
甚至改变之前的缓存方式或者更多的参数:
// 采用文件方式缓存数据300秒
S(‘name’,$value,array(‘type’=>’file’,’expire’=>300));
如果你在缓存设置的时候采用上面的数组方式传入参数的话,会影响到后面的缓存存取。
缓存读取
// 读取缓存
$value = S(‘name’);
缓存读取的是前面缓存设置的值,这个值会受缓存初始化或者缓存设置的时候传入的参数影响。 如果缓存标识不存在或者已经过期,则返回false,否则返回缓存值。
缓存删除
// 删除缓存
S(‘name’,null);
删除缓存标识为name的缓存数据。
实战项目部分案例:
方案一:
if(S('Users_index')){
$arr=S('Users_index');
}else{
$arr=$obj->table(C("DB_PREFIX")."users as a")
->field("a.*,b.groupname")
->where($tj)
->join('left JOIN '.C("DB_PREFIX").'users_group as b ON b.id=a.gid')
->limit($Page->firstRow.','.$Page->listRows)
->select();
S('Users_index',$arr,array('type'=>'file','expire'=>10));
}
或者直接按如下写法:
方案二:推荐使用,效果和方案一一样的,但是写法更简单。
$arr=$obj->table(C("DB_PREFIX")."users as a")
->field("a.*,b.groupname")
->where($tj)
->join('left JOIN '.C("DB_PREFIX").'users_group as b ON b.id=a.gid')
->limit($Page->firstRow.','.$Page->listRows)
->cache('Users_index',10)
->select();
提示:生成的文件缓存存储在:App\Runtime\Temp 目录中。
提示:若同时开启了页面静态缓存和局部数据缓存,则以页面缓存优先!