thinkphp框架={
#######路由规则######
#下面是一个标准的URL访问格式:
http://serverName/index.php/模块/控制器/操作#模块指的是你放控制器的目录名
http://serverName/index.php/Home/Index/index#默认入口文件,也可以简写http://serverName/index.php
#上面这种URL模式就是系统默认的PATHINFO模式
ThinkPHP支持的URL
模式有四种:普通模式、PATHINFO、REWRITE和兼容模式。
1 普通模式:
http://localhost/?m=home&c=index&a=hello&name=thinkphp
#m参数表示模块,c表示控制器,a表示操作(当然,这些参数名是可以配置的),后面的表示其他GET参数。也可以不传
2 PATHINFO模式
http://localhost/index.php/home/index/hello/name/thinkphp/#PATHINFO地址的前三个参数分别表示模块/控制器/操作。后面是参数
也可以用普通模式的参数方式传入参数,例如:
http://localhost/index.php/home/index/hello?name=thinkphp
3 REWRITE模式
上添加了重写规则的支持,可以去掉URL地址里面的入口文件index.php
4 兼容模式(用的少)
兼容模式是用于不支持PATHINFO的特殊环境,URL地址是:
http://localhost/?s=/home/index/hello/name/thinkphp
#######视图######
thinkPHP内置了一个编译型模板引擎,也支持原生的PHP模板
#和Smarty不同,ThinkPHP在渲染模板的时候如果不指定模板,则会采用系统默认的定位规则
$this->display();
$this->display('home');#指定html
#其定义规范默认是模块目录下面的 View/控制器名/操作名.html
$this->display("hello");#一定要省略.html,访问指定hello.html
重点:
#如果一个连接里没写任何方法,则会直接去找对应的模版文件
http://serverName/index.php/Home/From/add#没定义控制器里的任何方法,则显示From目录里的add.html
#在index.php里面写入以下默认目录,则访问和请求都可以省略目录
'APP_GROUP_LIST' => 'Home,Admin', //项目分组设定
'DEFAULT_GROUP' => 'Home', //默认分组
define("BIND_MODULE","Home");# 绑定Home模块到当前入口文件
控制器
public function read($id=0){#$id是参数
http://localhost/app/index.php/Home/Form/read/id/1#会自动传参数进去
}
#html
<FORM method="post" action="__URL__/insert">
标题:<INPUT type="text" name="title"><br/>
内容:<TEXTAREA name="content" rows="5" cols="45"></TEXTAREA><br/>
<INPUT type="submit" value="提交">
</FORM>
#php自动表单类
controller:
namespace Home\Controller;
use Think\Controller;
public function insert()
{
$Form = D('Form');
if ($Form->create()) {
$result = $Form->add();
if ($result) {
$this->success('数据添加成功!');
} else {
$this->error('数据添加错误!');
}
} else {
$this->error($Form->getError());
}
}
用D()实例化一个模型,一定要要有对应的模型类,没有的话就相当于M()
D("名称");#//如果是表名,不用新建模型 相当于M函数
D("名称");#必须新建一个模型文件,获得模型类,相当于new 模型名;可以直接调方法
#模型名+Model.class.php
D()和M()方法的区别:
M('User')#M()方法,也是调用了Thinkphp内置的 new \Think\Model('User')类;直接进行表操作
D('User')#D方法没有找到定义的模型类,则会自动调用M方法。用于自动验证,自动完成
C函数
C函数是读取和设置配置选项的函数
echo C("URL_PATHINFO_DEPR");//获取配置
C("URL_PATHINFO_DEPR",'-');//设置配置
I函数
I('get.')//防止XSS共计和sql注入,所做的过滤函数
namespace Home\Model;
use Think\Model;
class FormModel extends Model {#提交表单的时候,它会自动执行检测,会自动提交到表里
// 定义自动验证
protected $_validate = array(
array('title','require','标题必须'),
);
// 定义自动完成
protected $_auto = array(
array('create_time','time',1,'function'),
);
}
#直接可以这样添加数据;M("bbsinfo")->data($_POST)->add(); 因为$_POST是一维数组
window.location ="";#页面跳转到那个地址
#视图显示数据函数
#公用html存储位置
View
Public
header.html
footer.html
success.html
<include file="Public:header"/>#映入到html页面
1、volist标签 #循环遍历,name为数组,如果是select,则值为{$v.字段名},如果是find,不能显示单个,find不用循环,直接$find[0]
<volist name="array" id="v" key="k">
值:{$v} 序号:{$k}
</volist>
2.foreach标签 #也是循环标签,如果是select,则值为{$v.字段名},
<foreach name="key" item="v" key="k">#$k是0,1,2的key值
值:{$v} 下标:{$k}
</foreach>
3. <for start="0" end="5">#for循环,这里的$i为0,1,2,3,4
内容 循环变量:{$i}
</for>
4. <literal> #不编译,原样输出
Think标签
</literal>
5、switch标签#key一般是字段的名称,适用于find 判断
<switch name="key">
<case value="值">内容</case>
<case value="值">内容</case>
<case value="值">内容</case>
<default/>内容
</switch>
6、if标签#if判断,大于等于,一定要用thinkphp的标签
<if condition="条件">
内容
<elseif condition="条件"/>
内容
<else/>
内容
</if>
# <if condition="$result.title eq '认证失败通知'">
# 内容1
# <else/>
# 内容
# </if>
7、比较标签
< lt
<= elt
> gt
>= egt
== eq
=== heq
!= neq
!== nheq
8、运算标签
+ - * / % ++ --
# ThinkPHP系统常量
__APP__:返回入口文件地址(链接地址、跳转地址)
__ROOT__:返回根目录地址(引入css、images、library)
#html里面的链接路由
1)超链接地址
<a href="index.php?c=控制器&a=方法"></a>
<a href="index.php?c=控制器&a=方法&名=值"></a>
2)引入样式表
<link href="public/css/xxx.css">
2、pathinfo
http://localhost/项目/index.php
http://localhost/项目/index.php/控制器/方法.html
http://localhost/项目/index.php/控制器/方法/名/值.html
1)超链接地址
<a href="__APP__/控制器/方法.html"></a>
<a href="__APP__/控制器/方法/名/值.html"></a>
2)引入样式表
<link href="__ROOT__/public/css/xxx.css">
U()用法:#跳转页面、链接地址
1、控制器
U("控制器/方法");#他会直接找View目录里对应的html,<a href="{:U('/Form/add')}">5555</a>
#有点类似于:window.location = "__APP__/Index/index";
###########################最详细的查询#####################
1、查询多条记录,返回:二维数组
$result = $model->select();
$result = $model->field("字段,字段...")->select();
$result = $model->where()->select();
$result = $model->order()->select();
$result = $model->limit()->select();
$result = $model->field()->where()->order()->limit()->select();
2、添加记录,#返回:受影响的行数、新加记录的主键值
$result = $model->add(一维关联数组);
$result = $model->data(一维关联数组)->add();
3、删除记录,#返回:受影响的行数
$result = $model->where()->delete();
4、查询一条记录,#返回:一维关联数组
$result = $model->find();
$result = $model->field()->find();
$result = $model->where()->find();
$result = $model->field()->where()->find();
5、修改记录,#返回:受影响的行数
$result = $model->save(一维关联数组);
$result = $model->where()->save(一维关联数组);
6、执行select语句#原生,返回:二维数组
$result = M()->query("select语句");
7、执行insert、update、delete操作,#原生,返回:受影响的行数
$result = M()->execute("insert|update|delete语句");
8、聚合查询
$result = $model->count();
$result = $model->sum("字段");
$result = $model->avg("字段");
$result = $model->max("字段");
$result = $model->min("字段");
#页面重定向,php那边的重定向
1、跳转页面
$this->redirect("控制器/方法");#如果方法不存在,那只会去找控制器默认的index.html
$this->redirect("控制器/方法",array(名=>值,名=>值));
2、跳转页面,并提示信息
$this->redirect("控制器/方法",array(),时间,提示信息);#等待时间,提示信息就是在页面上,不是弹窗
$this->redirect("控制器/方法",NULL,时间,提示信息);
#系统提示信息页面,自带页面
$this->success(提示信息,跳转地址);#
$this->error(提示信息,跳转地址);#
#自定义success页面
1、在View/Public下新建一个success.html
提示信息:{$message} 跳转地址:{$jumpUrl}
2、修改配置文件,设置success页面
'TMPL_ACTION_ERROR' => "Public:success",
'TMPL_ACTION_SUCCESS'=> "Public:success",
}
#在子类的控制器中:构造函数
public function _initialize()
{}
#_initialize类似构造函数,会在__construct函数之后执行
###############公共函数类############
Common文件夹的用法:定义公用函数
1、在Common文件夹下新建一个function.php
2、function.php文件名固定(该文件由系统自动加载)
3、控制器、视图都可以直接调用
#############Thinkphp自带的图片上传类################
namespace Home\Controller;
use Think\Controller;
use Think\Upload;//导入上传类
#单张图片
public function upload()
{
#实例化
$upload = new Upload();#设置最大上传的大小
$upload->maxSize = 10000000;#设置允许上传的扩展名
$upload->exts = array("jpg","gif");#是否创建子目录
$upload->autoSub = false;#设置保存路径的根目录
$upload->rootPath = "./";#保存路径
$upload->savePath = "public/upfile/";#上传文件
$myFile = $_FILES["myFile"];#name input上传
$result = $upload->uploadOne($myFile);
if($result)
{
print_r($result['savepath'].$result['savename']);#保存图片地址,保存到数据库
}
else
{
$message = $upload->getError();//上传的错误信息
$this->success($message,__APP__."/Upload1/index");
}
}
#多张图片,多个input上传
public function upload()
{
$upload = new Upload();#设置最大上传的大小 实例化
$upload->maxSize = 10000000;#设置允许上传的扩展名
$upload->exts = array("jpg","gif","png");#是否创建子目录
$upload->autoSub = false;#设置保存路径的根目录
$upload->rootPath = "./";#保存路径
$upload->savePath = "public/upfile/";#上传文件
$result = $upload->upload();
if($result)
{
print_r($result['myFile1']['savepath'].$result['myFile1']['savename']);保#存图片地址,保存到数据库
}
else
{
$this->success($upload->getError(),__APP__."/Upload2/index");
}
}
#ThinkPHP缓存:文件缓存、数据缓存(变量缓存)
$t2 = S("t2");#从缓存中获得数据,供下一次缓存使用 //数据缓存(快捷缓存)
if($t2 == NULL)#如果没有,继续缓存
{
$t2 = time();
S("t2",$t2,3);# 向缓存中添加数据,3秒缓存时间
}
S("t2",NULL);#清除指定的缓存
#F()方法缓存,仅用于简单数据缓存,并且只能支持文件形式,不支持缓存有效期,没有时间概念
#数据库缓存
$bbsInfo = M("bbsinfo")->cache(true,10)->select();#在10s内不必向数据库查询,直接使用缓存内的数据