一、模型操作
1.6、查询数据
官网说明:https://www.kancloud.cn/manual/thinkphp5_1/354045
查询单条
// 模型的查询 get直接查询,不可以带where条件,find两者都可以 推荐
$ret = Articles::get(102);//不能加条件
$ret = Articles::find(102);
$ret = Articles::where('id',102)->find();
$user = User::where('name', 'thinkphp')->find();
查询多条
# 查询多条记录
$list = User::where('status', 1)->limit(3)->order('id', 'asc')->select();
获取某个字段或者某个列的值
// 获取某个用户的积分
User::where('id',10)->value('score');
// 获取某个列的所有值
User::where('status',1)->column('name');
条件分组 where () or ()
$ret = Articles::where(function (Query $query){
#print_r(func_get_args());打印参数列表
$query->where('id','>',200);
})->whereOr(function (Query $query){
$query->where('click','>=',101);
})->select();
动态查询
// 查询title字段为"我是张三"的记录 条件删除
$ret = Articles::where('title','我是张三')->select();
// 动态查询 getBy固定 字段名,首字母大写,遇到下划线,下划线的后的首字母大写
// 例: title_article getByTitleArticle
$ret = Articles::getByTitle('我是张三');
// 根据name字段查询用户
$user = User::getByName('thinkphp');
// 根据email字段查询用户
$user = User::getByEmail('thinkphp@qq.com');
聚合查询
User::count();
User::where('status','>',0)->count();
User::where('status',1)->avg('score');
User::max('score');
读取器
// 读取器
$ret = Articles::withAttr('title',function ($value,$data){
return '我是添加的内容 --- '.$value;
})->select();
dump($ret);
1.7、获取器
获取器的作用是对模型实例的(原始)数据做出自动处理。
获取器的作用是对模型实例的(原始)数据做出自动处理。一个获取器对应模型的一个特殊方法(该方法必须为public类型),方法命名规范为:
getFieldNameAttrFieldName为数据表字段的驼峰转换
// 获取器 get字段名Attr 如果有下划线,下划线的后首字母大写
public function getCreateTimeAttr($value){
return date('Y年m月d日 H时i分s秒',strtotime($value));
}
二、数据分页
一般在列表页数据展示时,如果数据太多,需要进行分页展示。
ThinkPHP5.1内置了分页实现,要给数据添加分页输出功能变得非常简单,可以直接在Db类查询的时候调用paginate方法
$list = db('user')->paginate(10);
return view('index@index/user',compact('$list'));
$list = User::paginate(10)
return view('index@index/user',compact('$list'));
//模板文件中分页输出代码如下
<div>
<ul>
{volist name='list' id='user'}
<li> {$user.nickname}</li>
{/volist}
</ul>
</div>
{$list|raw}
$data = Articles::paginate(3);
return view('index@article/index', compact('data'));
{foreach $data as $item}
<tr>
<td>{$item.id}</td>
<td>{$item.title}</td>
<td>
<div class="btn-group">
<a href="button" class="btn btn-xs btn-primary">修改</a>
<a href="button" class="btn btn-xs btn-danger">删除</a>
</div>
</td>
</tr>
{/foreach}
<!--视图分页推荐写法-->
{$data|raw}
<!--不推荐-->
{/*:html_entity_decode ($data->render())*/}
三、表单验证
表单验证是为了防止访问者跳过客户端验证(js验证)而造成的系统安全问题,一但非法用户绕过客户端验证而服务器端没有加以验证,这样就是很不安全了,所以项目必须要进行服务器端表单验证。
ThinkPHP5.1推荐使用验证器进行数据验证(也支持使用\think==Validate==类进行独立验证)
内置规则:
https://www.kancloud.cn/manual/thinkphp5_1/354107
3.1、独立验证
https://www.kancloud.cn/manual/thinkphp5_1/354107
$validate = Validate::make(
['name' => 'require|max:25','email' => 'email'],
['name.require' => '名称必须填写','name.max' => '名称最多只能是25字','email.email' => '邮箱不合法']);
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
];
if (!$validate->check($data)) {
dump($validate->getError());
}
# 自定义验证规则
Validate::extend('checkName', function ($value, $rule) {
return $rule == $value ? true : '名称错误';
});
// 独立验证规则 use think\facade\Validate;
// 自定义验证规则
Validate::extend('checkTitle', function ($value, $rule) {
return strstr($value, $rule) ? '不成功' : true;
});
// 独立内置规则验证
$validate = Validate::make(
['title' => 'require|min:2|checkTitle:李四',
'desn' => 'require']
, [
'title.require' => '标题不能为空',
'title.min' => '标题最少不能少于2个字',
'desn.require' => '描述不能为空',
]);
// 判断
if (!$validate->check($request->post())) {
// 如果有错误则返回错误信息
return $this->error($validate->getError());
}
3.2、验证器
thinkphp5.1之后推荐使用的方式,验证器,就是一个独立的文件,此文件就干一件事件,验证。
创建验证器
php think make:validate 模块名/验证器名(首字母大写)
# 验证器
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
];
protected $message = [
'name.require' => '名称必须',
'name.max' => '名称最多不能超过25个字符',
'age.number' => '年龄必须是数字',
'age.between' => '年龄只能在1-120之间',
'email' => '邮箱格式错误',
];
}
# 控制器
$ret = $this->validate($request->post(),User::class);
if (true !== $ret){
dump($ret);
}
验证器
namespace app\index\validate;
use think\Validate;
class ArticleValidate extends Validate {
/**
* 定义验证规则
* 格式:'字段名' => ['规则1','规则2'...]
*
* @var array
*/
protected $rule = [
'title' => 'require|checkName:aa|token'
];
/**
* 定义错误信息
* 格式:'字段名.规则名' => '错误信息'
*
* @var array
*/
protected $message = [
'title.require' => '标题不能为空,为空了我就去找小姐姐'
];
// 自定义规则
protected function checkName($value, $rule) {
return strstr($value, $rule) ? '不符合规则' : true;
}
}
控制器
// 第1种使用方法 了解
$validate = new ArticleValidate();
// 验证
if(!$validate->check($request->post())){
return $this->error($validate->getError());
}
// 第2种方式 推荐 控制器中有validate方法
#$ret = $this->validate($request->post(),'app\index\validate\ArticleValidate');
$ret = $this->validate($request->post(),ArticleValidate::class);
if(true !== $ret){
return $this->error($ret);
}
3.3、csrf验证
防止别人本地反复提交,所以添加token验证
验证器添加token
视图表单添加{:token()}
排除掉post发回的信息。
四、验证码
https://www.kancloud.cn/manual/thinkphp5_1/354122
tp5框架中默认没有自带验证码功能,需要我们自己去引入安装
官方提供的tp官方验证码类
composer require topthink/think-captcha
# 模板中引用
<div>{:captcha_img()}</div>
或者
<div><img src="{:captcha_src()}" alt="captcha" /></div>
# 验证
$this->validate($data,[
'code'=>'require|captcha'
]);
或者
if(!captcha_check($captcha)){
// 验证失败
};
验证器验证页面
class LoginValidate extends Validate
{
protected $rule = [
'code' => 'require|captcha|token'
];
protected $message = [
'code.captcha' => '你想干什么,验证码都不录入'
];
}
控制器内
验证器去验证
// 验证器去验证验证码 推荐方式
$ret = $this->validate($request->post(), LoginValidate::class);
if (true !== $ret) {
return $this->error($ret);
}
独立去验证验证码
// 独立去验证验证码
$code = $request->post('code');
// 如果验证不通过,则返回false
if (!captcha_check($code)) {
return $this->error('验证不正确');
}
html模板
<img src="{:captcha_src()}" id="vcode">
<script>
// 点击更新验证码图片
$('#vcode').click(function () {
let src = $(this).attr('src') + '?vt=' + Math.random();
$(this).attr('src',src);
})
</script>
配置验证码详情:在config中新建 captcha.php,用数组配置
效果
五、cookie和session处理
5.1、cookie操作
ThinkPHP采用think\facade\Cookie类提供Cookie支持。think\Cookie
配置文件位于 config/cookie.php中
# 设置
// 设置Cookie 有效期为 3600秒
Cookie::set('name','value',3600);//通过门面类的方式
cookie('name', 'value', 3600);//通过函数的方式
# 判断是否存在
Cookie::has('name');
cookie('?name')
# 获取
Cookie::get('name');
cookie('name');
# 删除
Cookie::delete('name');
cookie('name', null);
// 初始化 前缀
#cookie(['prefix' => 'aa_', 'expire' => 3600]);
// 设置cookie
cookie('names','zhangsan',300);
// 判断是否存在
#dump(cookie('?name'));
// 获取
#dump(cookie('name'));
// 删除
cookie('name',null);
dump(cookie('?names'));
// 清除所有,必须有前缀
#Cookie::clear('aa_');
cookie(null,'aa_');
dump(cookie('?names'))
// 跳转并写下闪存信息
return redirect(url('cs'))->with('success','登录成功');
5.2、session操作
可以直接使用think\facade\Session类操作Session
配置文件位于config/session.php文件中
# 设置
Session::set('name','thinkphp');//静态类
session('name', 'thinkphp');
# 闪存
Session::flash('name','value');
# 判断是否存在
Session::has('name');
session('?name');
# 取值
Session::get('name');
session('name');
# 删除
Session::delete('name');
session('name', null);
# 清空
Session::clear();
session(null);
// 设置
session('name','张三');
session('age','20');
// 个人在项目中定义session的习惯
session('admin.user','张三');
session('index.user','李四');
// 判断是否存在
dump(session('?name'));
// 获取
dump(session('name'));
// 删除指定的session
#session('name',null);
dump(session('?name'));
// 清空全部
#session(null);
dump(session('age'));
// 获取全部
dump(session(''));
#\think\facade\Session::flash('success','登录成功');
dump(session('success'));
5.3、闪存
# 定义好,在下一次HTTP请求中获取到,第2没有了
Session::flash('name','value');
六、中间件
中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。
6.0、传统式用户过滤
通过继承基类来达到权限的判断。
6.1、定义中间件
https://www.kancloud.cn/manual/thinkphp5_1/564279
php think make:middleware 中间件的名称
这个指令会 application/http/middleware目录下面生成一个中间件文件。
6.2、注册中间件
6.2.1、控制器注册 pathinfo
6.2.2、自定义路由 middleware
6.2.3、配置文件 middleware.php
此文件可以放在模块下,就是对此模块注册此中间件,在application下面,就是全局中间件,说白了,就是所有的模块将都有此中间件。
6.2.4、中间件参值
七、后台登录
视频文件已经保存到笔记中
见代码:/全栈教程/tp/day03/上课代码/article