一、基础
1. 开启调试模式
修改应用配置文件( application/config.php )中的 'app_debug' => true,为了安全,在正式部署的时候一定要关闭调试模式。
2. 导入类库的方法
这里使用了 use 来导入一个命名空间的类库,然后可以在当前文件中直接使用该别名而不需要使用完整 的命名空间路径访问类库。也就说,如果没有使用 use think\Controller; 就必须使用 class Index extends \think\Controller 这种完整命名空间方式。
二.Url和基本路由
一般情况下,在url中模块名和控制器名是不区分大小写的,但如果使用驼峰法(HelloWord),则在url中必须使用hello_word来访问
如果希望严格区分大小写访问(或者要支持驼峰法进行控制器访问),可以在应用配置文件中设置: // 关闭URL自动转换(支持驼峰访问控制器) 'url_convert' => false,
(2)参数的传入
在访问url时有三种方法
1》变量1/value/变量2/value
2》变量1/变量2/value1/value2
3》url?变量1=value1&变量2=value2
注意:如果在配置文件里面设置了按照参数顺序获取 'url_param_type' => 1,
1》和2》的访问方式会拿到变量1/value分别复制给两个参数
但是3》的访问方式仍然可以得到正确答案
(3) 定义路由
我们在路由定义文件( application/route.php )里面添加一些路由规则,如下:
代表以hello开头的所有访问都可以路由到
‘hello/:name’=>”index\index\hello”;
代表name参数是可选参数
‘hello/[:name]’=>”index\index\hello”;
代表完整匹配,只能匹配到index模块下面的index控制器下面的hello方法
‘hello/[:name]$’=>”index\index\hello”;
(4) 定义闭包
‘hello/[:name]’=>function($name)
{
Echo welcome!.$name;
}
http:localhost\tp5\hello\thinkphp;
三.向模板分配变量
一. 模板中包含文件
{include file="Common/header" title="哈哈"}<!-- header是模板名称 -->
<h1>ThinkPHP欢迎您!</h1>
{include file="index@Common/footer"}
(1)/*单独分配一个变量*/
$this->assign('name','Alice');
(2) /*分配多个变量*/
/*方法一*/
$this->assign([
'name'=>'Alice',
'sex'=>'女',
'age'=>19
]);
return $this->fetch('index');
/*方法二*/
return $this->fetch('index',[
'name'=>'Alice',
'sex'=>'女',
'age'=>19
]);
(3)$v=new View();
//分一维数组*/
$data=array('a1','a2','a3');
$v->arr=$data;
/*分配一维关联数组*/
$data2['name']="吉吉";
$data2['sex']="女";
$v->arr2=$data2;
/*分配简单变量
$v->name='haha';
/*分配多维数组*/
$data3=array(
'a1'=>array(1000,'a'),
'a2'=>array(1001,'b'),
'a2'=>array(1002,'c')
);
$v->arr3=$data3;
/*分配对象*/
$obj=new View();
$obj->name="尜尜";
$obj->sex="男";
$v->obj=$obj;
return $v->fetch('index');
模板中获取分配的数组以及对象
{$arr[0]}-{$arr[1]}-{$arr[2]}<br/>
<!-- 关联数组解析 -->
<!-- 方法一 -->
{$arr2['name']}----{$arr2['sex']}<br/>
<!-- 方法二 -->
{$arr2.name}----{$arr2.sex}
<hr>
<!-- 获取多维数组 -->
<!-- 方法一 -->
{$arr3['a2'][0]}<br/>
<!-- 方法二 -->
{$arr3.a1[1]}
<hr>
<!-- 获取分配过来的对象的内容 -->
{$obj->name}
四.模板中的比较标签
<h1><font color="blue">一.比较标签</font></h1>
<!--
(1)等于eq
(2)大于gt
(3)大于等于egt
(4)小于lt
(5)小于等于elt
(6)不等于neq
(7)恒等于heq
(8)不恒等于nheq
-->
<!-- 所有的比较标签用法都一样,区别就是判断条件不同,而且他们都能和else标签一起使用
而且对于所有的类型,name和value的赋值必须要加双引号!!!!!
-->
<!-- 当name的值大于value的值时输出相等,也可以和else混合使用-->
1.{eq name="$a" value="12"}
相等
{else/}
不相等
{/eq}
<hr>
<!-- 当name的值大于value的值 -->
2.{gt name="$a" value="5"}111{/gt}
<!-- 当name的值大于等于value的值 -->
3.{egt name="$a" value="5"}2222{/egt}
<!-- 判断一个恒等 -->
4.{heq name="$a" value="12"}
恒等于
{else/}
不相等
{/heq}
<hr>
<!-- 比较标签中的变量可以支持对象的属性或者数组,甚至可以是系统变量 -->
<!-- 用对象的属性进行判断 -->
1.{eq name="obj->a" value="12"}
{$obj->a}
{else/}
不相等
{/eq}
<hr>
<!-- 用数组进行判断 -->
2.{eq name="arr[2]" value="12"}
{$arr[2]}
{else/}
不相等
{/eq}
<hr>
<!-- 所有的比较标签可以统一使用compare标签(其实所有的比较标签都是compare标签的别名),例如: 当name变量的值等于5就输出 ,其中type属性的值就是比较标签名称!!!!
-->
{compare name="$a" value="13" type="heq"}
相等
{else/}
不相等
{/compare}
<hr >
<h1><font color="blue">二.标签的嵌套?????</font></h1>
<!-- 解释volist标签 -->
<!--
属性:
1.name(必选):要输出的数据模板变量
2.id(必须):循环变量
3.offset(可选):要输出数据的offset
4.length(可选):输出数据的长度
5.key(可选):循环的key变量,默认值为1
6.mod(可选):对key值取模,默认值为2
7.empty(可选):如果数据为空显示的字符串
-->
<h1><font color="blue">三.条件判断</font></h1>
<!-- 1.switch标签 用法-->
<!-- 其中name属性可以是系统变量也可以是函数
对于case的value属性可以支持多个条件的判断,使用”|”进行分割,例如:
value="gif|png|jpg" 图像格式
也可以对case的value属性使用变量,例如:
value="$adminId"
使用变量方式的情况下,不再支持多个条件的同时判断。
-->
{switch name="$a"}
{case value="12"} 相等{/case}
{case value="13"} 小于value的值{/case}
{case value="10"} 大于value的值{/case}
{default/}这是默认情况
{/switch}
<hr >
<!-- 2.if条件判断 if条件存在condition-->
{if condition="($a == 1222) OR ($a < 0) "}
符合条件
{elseif condition="$a eq 12"/}
这是elaeif的条件输出语句
{else /}
以上条件不满足
{/if}
<hr >
<!-- condition属性可以支持点语法和对象语法 -->
{if condition="$obj->a neq '12'"}
呀!不想等额
{else/}
{$obj->a}
{/if}
<hr>
{if condition="$arr2.a1[1] neq 'a'"}
不相等
{else/}
{$arr2.a1[1]}
{/if}
<hr color="yellow">
<h1><font color="blue">四.范围判断</font></h1>
<!-- name属性还支持直接判断系统变量;value属性还可以使用系统变量 -->
<!-- value属性也可以使用变量,该变量可以是数组也可以是逗号分隔的字符串 -->
<!-- 1.用in标签来判断模板变量是否在某个范围内 -->
{in name="a" value="1,2,13"}
a在范围内
{else/}
a不在范围内
{/in}
<hr>
<!-- 2.使用notin标签来判断模板变量是否不在某个范围内 -->
{notin name="a" value="1,11,111"}
a不在范围
{/notin}
<hr>
<!-- 3使用between来判断模板变量是否在某个区间内 -->
<!-- 4.使用notbetween来判断模板变量是否不在某个区间内 -->
注意:当使用between标签的时候,value只需要一个区间范围,也就是只支持两个值,后面的值无效,例如:1,3,10,实际判断的范围区间是1~3,而不是1~10!!!!也可以支持字符串判断<br>
<!-- name属性可以直接使用系统变量,value属性也可以使用变量,变量的值可以是字符串或者数组,还可以支持系统变量。
-->
<!-- 可以使用range标签替换前面两种范围判断的标签 -->
{range name="a" value="1,12,11,13" type="in"}
a在范围内
{/range}
<hr>
<!-- present标签用来判断name后面那个模板变量是否赋值,相应有notpresent -->
<!-- name属性可以使用系统变量 -->
{present name="c"}
c已经赋值
{else /}
c还没有赋值
{/present}
<!--
1.empty标签用于判断某个变量是否为空,如果判断没有赋值可以使用notempty,name属性可以直接使用系统变量
2.defined标签用于判断某个常量是否有定义,相应的有notdefined
注意!:name属性的值要注意严格大小写
-->
<h1><font color="blue">五.循环输出标签</font></h1>
<!-- volist标签 -->
<!-- name属性表示模板赋值的变量名称,不可随意更改 -->
<!-- id可随意更改,只要不和name属性冲突 -->
<!-- 1.循环遍历写法1-->
<table border="1px">
{volist name="list" id="vo"}
<tr>
<td>{$vo.id}</td>
<td>{$vo.data}</td>
</tr>
{/volist}
</table>
<!-- (1)支持输出查询结果的部分数据 -->
<!--
1.offset是指从第几条记录开始打印查询结果,length表示打印多少条,是代表一个长度
-->
<table border="1px">
{volist name="list" id="vo" offset='4' length='5'}
<tr>
<td>{$vo.id}</td>
<td>{$vo.data}</td>
</tr>
{/volist}
</table>
<hr color="green">
<!--
用遍历的行的索引对mod的值取余,可以使用eq函数来判断余数和eq的value值,相等时执行相应的操作
-->
{volist name="list" id="vo" mod="5"}
{$vo.id}
{eq name="mod" value="2"}
<br/>
{/eq}
{/volist}
<hr color="pink">
<!-- 输出循环变量 -->
<!-- $k由循环来决定,第一次循环k的值为1,以此类推 -->
{volist name="list" id="vo" key="k" }
{$k}.{$vo.data}<br>
{/volist}
<hr>
<!--如果没有指定key属性的话,默认使用循环变量i, -->
{volist name="list" id="vo" }
{$i}.{$vo.data}<br>
{/volist}
<hr>
<!-- 如果要输出数组的索引,可以直接使用key变量,和循环变量不同的是,这个key是由数据本身决定,而不是循环控制的 -->
{volist name="list" id="vo" }
{$key}.{$vo.data}<br>
{/volist}
<hr color="yellow">
<!-- 2.循环遍历写法2使用foreach循环遍历 -->
1.方法1<br>
{foreach $list as $v}
{$v.id}:{$v.data}<br>
{/foreach}
<hr>
2.方法2<br>
<!-- name表示数据源 item表示循环变量 -->
{foreach name="list" item="v"}
{$v.id}:{$v.data}<br>
{/foreach}
<hr>
3.方法3:可以定义索引的变量名<br>
{foreach name="list" item="vo" key="k" }
{$k}.{$vo.data}<br>
{/foreach}
<hr>
4.方法4:可以输出索引<br>
{foreach name="list" item="vo" }
{$key}.{$vo.data}<br>
{/foreach}
<hr color="red">
<!-- for标签 -->
{for start="1" end="19"}
{$i}
{/for}
<!-- 解析后的代码 -->
<!-- for ($i=1;$i<100;$i+=1)
{
echo $i;
}
-->
五.查询构造器
<?php
namespace app\index\controller;
use think\Controller;
use think\View;
use think\Db;
use think\Request;
class Demo
{
public function index()
{
/*单行查询,find只能用单行查询*/
/*$data = Db::name('data')->find();
echo "<pre>";
print_r($data) ;
echo "</pre>";*/
/*简单查询方法*/
/*1.使用where方法多字段查询*/
/*$data =DB::table("think_data")
->where('id','like','2')
->where('data','php')
->find();*/
/*2.多字段相同的and查询简化操作*/
/*有多行结果使用select*/
/* $data=DB::table('think_data')
->where('data&id','like','%2%')
->select();*/
/*3.使用whereOr方法多字段查询*/
/*使用find()只能查询到一行数据使用select()会将数据库中的所有符合条件的行全部查到*/
/* $data=DB::table('think_data')
->where('data','like','%2%')
->whereOr('id','like','%2%')
->find();
$data=DB::table('think_data')
->where('data','like','%2%')
->whereOr('id','like','%2%')
->select();*/
/*使用whereOr查询的简化操作*/
/*$data=db::table('think_data')
->where('data|id','like','%2%')
->select();*/
/*复合查询,where和whereor混合使用*/
/* $result=db::table("think_data")
->where(function($query){
$query->where('id','like','1')
->whereor('id','like','12');
}) ->whereor(function($query){
$query->where('data','like','think')
->whereor('data','like','%d%');
})
->select();*/
/*获取think_data表的所有信息*/
/*
'fields':获取`think_data`表所有字段
type':获取`think_data`表所有字段的类型
'pk':获取`think_data`的主键
*/
/* $data=Db::getTableInfo('think_data');*/
/*查询数据*/
/*查询一个数据使用find(),查询结果不存在返回null*/
/*查询数据集使用select(),查询结果不存在返回一个空数组*/
/*默认情况下find和select方法返回的都是数组*/
/*1.助手函数??????????????????????????????????????*/
/*$data=db('think_data')->where('id',12)->find();*/
/*2.使用query对象或者闭包查询*/
/*$query=new \think\Db\Query();
$query->table('think_data')->where("id",12);
$data=Db::find($query);*/
/*值和列查询*/
/* $data=Db::table('think_data')->where('id',1)->column('data');*/
/*3.使用批量查询*/
/* $data=Db::table('think_data')
->where([
'id'=>['like','%2%'],
'data'=>['like','%d%']
])
->select();
echo "<pre>";
print_r($data) ;
echo "</pre>";*/
/*数据表的更新操作*/
/*更新数据表,返回影响行数,无任何更新返回0*/
/*$data=Db::table('think_data')
->where('id','1')
->update(['data'=>'linux']) ;*/
/*将数据库中某个字段的时间修改为现在的时间,使用now()函数*/
/*$data=Db::table('think_data')
->where('id','1')
->update([
'time'=>['exp','now()']
]);*/
/*修改某个字段的值 ,返回影响数据的条数*/
/*$data=Db::table('think_data')
->where('id',22)
->setField(['data'=>'linux2']);*/
/*
自增或自减一个字段的值
setInc/setDec 如不加第二个参数,默认值为1
setInc/setDec 方法返回影响数据的条数
*/
/*$data=Db::table('think_data')
->where('data','linux')
->setInc('id','3');*/
/*使用助手函数更新数据库??????????????????????????*/
/*$data=db('user')->where('id',72)->update(['data' => 'thinkphp11111']);*/
/* return $data;*/
/*聚合查询*/
// count 统计数量,参数是要统计的字段名(可选)
// max 获取最大值,参数是要统计的字段名(必须)
// min 获取最小值,参数是要统计的字段名(必须)
// avg 获取平均值,参数是要统计的字段名(必须)
// sum 获取总分,参数是要统计的字段名(必须)
/*$data=Db::table('think_data')->max('id');
*/
/*删除数据*/
// 根据主键删除
/*$data=Db::table('think_data')->where('id','82')->delete();
return $data;
*/// 根据条件删除
/*添加数据*/
// 添加一条数据
/*$data = ['data' => 'bar', 'time' => '2019-12-12'];
$res=Db::table('think_data')->insert($data);*/
/*$data = ['data' => 'b', 'time' => '2018-12-12'];*/
// getLastInsID方法添加数据成功返回添加数据的自增主键
/*Db::table('think_data')->insert($data);
$userId = Db::table('think_data')->getLastInsID();*/
// 或者直接使用insertGetId 方法新增数据并返回主键值:
/*$userId =Db::table('think_data')->insertGetId($data);*/
// 添加多条数据
/*$data=[
['data' => 'b', 'time' => '2018-12-12'],
['data' => 'f', 'time' => '2018-12-12'],
['data' => 'g', 'time' => '2018-12-12'],
['data' => 'h', 'time' => '2018-12-12']
];
$userId=Db::table('think_data')->insertAll($data);
return $userId;*/
原生查询
// Db类支持原生SQL查询操作,主要包括下面两个方法:
/*query方法*/
/*query方法用于执行SQL查询操作,如果数据非法或者查询错误则返回false,否则返回查询结果数据集(同select方法)。*/
/*$data=Db::query("select * from think_data ");
echo "<pre>";
print_r($data) ;
echo "</pre>";*/
// execute方法
// execute用于更新和写入数据的sql操作,如果数据非法或者查询错误则返回false ,否则返回影响的记录数。
// 修改
/*$data=Db::execute("update think_data set data='thinkphp' where id=86");
*///删除
/*$data=Db::execute("delete from think_data where id =87");
var_dump($data); */
// 排序和limit
/*$data=Db::table('think_data')->order('id desc')->limit(5)->select();*/
// page,第一个参数代表第几页
/*$data=Db::table('think_data')->page('3,3')->select();*/
// field方法 代表查询的结果集中都包含那些字段
/*$data=Db::table('think_data')->field('id')->select();*/
// group方法
/*$data=Db::table('think_data')
->field('max(id),data')
->group('id')
->select();
echo "<pre>";
print_r($data) ;
echo "</pre>";*/
}
public function hello(Request $request)
{
// 控制器中获取参数
return $request->param('a');
}
}
六.模型层的增删改
模型层:
<?php
namespace app\admin\model;
use think\Model;
// 当我们起的类名和我们数据库中的表名一致的话当然会自动找到,但是
//如果不一致的话,我们可以手动去关联一下,
// 方法一:如果在database.PHP配置文件中配置了表的前缀,我们只需要给个表名,$name假设是成员属性
/*procect $name='user'*/
// 方法二:包含前缀
/*protect $table='tp_user'*/
/*因为所有的方法都在MODEL类里面,必须要继承一下*/
class Book extends Model{}
<一>增删改
/*数据单行插入一*/
// 首先实例化Users对象
/*$user=new Users();
$user->userName="小鹏";
$user->userPwd="12344";
$user->userEmail="[email protected]";*/
return ($user->save());//save()的返回值是受影响行数
/*数据单行插入二*/
//返回值是一个数组,该数组包括该行信息的所有
$data['userName']="小红";
$data['userPwd']="12344";
$data['userEmail']="[email protected]";
$res=Users::create($data);
return dump($res);
/*数据的批量插入*/
// 首先实例化Users对象
/* $u=new Users();
$data=[
['userName'=>'qq','userPwd'=>11,'userEmail'=>"[email protected]"],
['userName'=>'ww','userPwd'=>11,'userEmail'=>"[email protected]"],
['userName'=>'com','userPwd'=>11,'userEmail'=>"[email protected]"]
];
$res=$u->saveAll($data);
return dump($res);*/
/*数据的更新操作一*/
// 返回受影响的行数
/*首先使用get方法获取到你要更改的数据信息*/
/*$user=Users::get(1007);
$user->userName="仙女";
$res=$user->save();
return dump($res);*/
/*数据更新操作二*/
// 返回数组类型
/* $data['userName']="大仙女";
$res=Users::update($data,['userId'=>1003]);
return dump($res);*/
/*数据的删除一*/
// 返回受影响的行数
/* $data=Users::get(1007);
$res=$data->delete();
return $res;*/
/*数据的删除二*/
// 返回受影响的行数
/*$res=Users::destroy(1003);
return $res;*/
}
<二>查
/*根据主键值的查询*/
$res=Users::get($id);
return $res->userName;
/*根据某个字段的值查询*/
$res=Users::get(['userName'=>'小鬼']);
return $res->userName;
/*使用where条件指定*/
/*$res=Users::where(['userId'=>$id])->find();
return $res;*/
/*$res=Users::where('userId',$id)->find();
return $res;*/
//这里我们可以使用数组的形式访问对象属性,
//这是因为父类Model实现了\ArrayAccess接口
/* $res=Users::where('userId',$id)->find();
return $res['userName'];*/
//使用getByXXX方法根据表中的某个字段的值进行查询
/*$res=Users::getByusername('妮妮');
return $res['userId'];*/
// 数据的多行查询
/* $res=Users::all();
return dump($res);*/
$res=Users::all(['type'=>'计算机']);
$res=Users::where('username','like','%秀%')->select();
六.会话机制
使用redirect()函数实现tp5中页面的跳转
1》Cookie
(1)设置Cookie使用Cookie::set()或者使用助手函数Cookie()
(2)判断Coookie是否存在使用Coookie::has();
(3)获取Cookie的值使用Coookie::get();
(4)清除Coookie使用Coookie::delete();或者使用助手函数Coookie(‘’,null)
2》Session
(1)设置Session使用Session::set()或者使用助手函数Session()
(2)判断Session是否存在使用Session::has();
(3)获取Session的值使用Session::get();
(4)清除Session使用Session::delete();或者使用助手函数Session(‘’,null)
3》tp5中的分页
(1)每页显示3条数据
$data=Db::table('book')->paginate(3);
(3)查询总条数
$totalnum=Db::table('book')->count();
在模板中只需要这个函数就可以显示分页
{$booklist(分配过来的$data)->render()}
4》tp5中的图片上传
Index.html
<form id="sc" action="{:url('uploadprocess')}" method="post" enctype="multipart/form-data" target="shangchuan">
<input type="file" name="myfile" value="" />
<input type="submit" value="点击上传">
</form>
'uploadprocess'方法
/*实现上传逻辑*/
public function uploadProcess()
{
$request=request();
// 获取表单上传文件
$fileobj=$request->post('myFileName');
/*dump($res);*/
// 移动到框架应用根目录/public/uploads/ 目录下
$info=$fileobj->move(ROOT_PATH.'public'.DS.'uploads');
if($info)
{
// 上传成功,
// 方法一:只获取文件信息获取到图片的名称 1686c673f9f50197de9b2ea36277b4c5.jpg
/* return $info->getFilename();*/
// 方法二:获取到uploads下面的文件夹以及图片名称 20180402\1686c673f9f50197de9b2ea36277b4c5.jpg
$this->assign('filename',$info->getSavename());
return $this->fetch('uploadprocess');
}else{
// 上传失败,获取错误信息
return $file->getError();
}
}
5》tp5中验证码使用
<input type="text" name="Code" id="code" placeholder="请输入验证码"><img src="_STATIC_yzm/vdimgck.php" onclick="this.src=this.src+'?'">