国强极客
有问题请加微信:guoqiang7585
国强极客

ThinkPHP框架_03 查询分页验证cookie中间件

ThinkPHP框架_03 查询分页验证cookie中间件

一、模型操作

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

赞赏
对内容有疑问,请加我微信:guoqiang7585
#
首页      全栈教程      Thinkphp      ThinkPHP框架_03 查询分页验证cookie中间件

国强极客

文章作者

博客站长,有问题请加微信【guoqiang7585】。

国强极客

ThinkPHP框架_03 查询分页验证cookie中间件
一、模型操作 1.6、查询数据 官网说明:https://www.kancloud.cn/manual/thinkphp5_1/354045 查询单条 // 模型的查询 get直接查询,不可以带where条件,find两者都可以 推荐 $ret = Arti…
扫描二维码继续阅读
2019-11-19