技术学习

THINKPHP 3

day3

修改操作

  • //save方法
  • //先查询再修改
  • $goods=\app\admin\model\Goods::find(32);
  • $goods -> goods_price ='123.00';
  • $goods -> goods_number = 321;
  • $res1 =$goods->allowField(true)->save();
  • dump($res1);
  • //返回一个1 代表修改了一条
  • //(推荐)静态update方法 修改数据 修改条件 过滤非数据表字段
  • \app\admin\model\Goods::update(['goods_price'=>'123.00','goods_number'=>321,'id'=>33],[],true);
  • \app\admin\model\Goods::update(['goods_price'=>'123.00','goods_number'=>321,'id'=>33],['id'=>33],true);
  • $res2 =\app\admin\model\Goods::update(['goods_price'=>'123.00','goods_number'=>321],['id'=>33],true);
  • dump($res2);
  • //返回的是数据库模型对象
  • //底层Db的update方法 (通过where方法后使用update方法
  • //通过where方法 返回的是修改条数
  • //单个修改
  • $res3 = \app\admin\model\Goods::where('id',34)->update(['goods_price'=>'123.00','goods_number'=>321]);
  • dump($res3);
  • //批量修改
  • $res4 = \app\admin\model\Goods::where('id','>=',53)->update(['goods_price'=>'123.00','goods_number'=>321]);
  • dump($res4);

区别返回值不同 模型的update方法 和底层update(where)方法区别
1.返回值不同,模型返回模型对象,底层返回修改条数
2.包含的功能不同 模型的update有过滤非数据表字段功能 底层的没有

只有静态方法可以过滤非数据表字段

save方法既可以做添加方法也可以做修改方法,在于传来的值是否有主键ID

手动判断save是否更新

  • $user= User::get(1);
  • $user->name = 'thinkphp';
  • //显示指定当前操作为新增操作
  • $user->isUpdate(false)->save();

删除操作

先查询,在调用模型delete方法删除

  • $user = User::get(1);
  • $user -> delete();

先调用where方法,在调用Query类的delete方法删除

  • User::where('id',1)->delete();

静态调用 destroy 方法删除(推荐)

  • User::destroy(1);
  • User::destroy('1,2,3');
  • User::destroy([1,2,3]);
  • User::destroy(['status'=>1]);

例子

  • //查询并删除(调用模型的delete方法)
  • //Goods返回的是一个对象
  • $goods = \app\admin\model\Goods::find('41');
  • $res =$goods->delete();
  • dump($res);
  • dump($goods);
  • $goods = \app\admin\model\Goods::find('41');
  • //Call to a member function delete() on a non-objec
  • //先查询后删除 如果没有查询到数据 会报错 查询到的是一个对象 查询为空会返回NULL
  • //需要使用empty判断是否为空
  • if(empty($goods)){
  • echo "数据已经不存在了";die;
  • }
  • $res =$goods->delete();
  • dump($res);
  • //通过where指定条件 再调用Query对象的delete方法
  • //where返回的是db对象 如果查询没有结果 删除delete的时候 显示int(0) 影响0条
  • $res =\app\admin\model\Goods::where('id','42')->delete();
  • dump($res);
  • //destroy方法 返回int(1) 括号里显示影响条数
  • $res = \app\admin\model\Goods::destroy('38');
  • dump($res).("=============");
  • $res = \app\admin\model\Goods::destroy('39,40');
  • dump($res).("=============");
  • $res = \app\admin\model\Goods::destroy([36,47]);
  • dump($res).("=============");
  • $res = \app\admin\model\Goods::destroy(['goods_price'=>'0.01']);
  • dump($res).("=============");

注意点使用delete方法 必须先查询是否有这个数据,如果没有会报错。所以需要多加一层判断

Traits

trait 是一种为类似 PHP 的单继承语言而准备的代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由的在不同层次结构内独立的类中复用方法集。trait和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类 ( mixin ) 相关的典型问题

  • trait A{
  • public function getName()
  • {
  • return "this is trait";
  • }
  • }
  • class B{
  • use A;
  • }
  • $b = new B();
  • echo $b->getName(); //This is trait

只有class可以被实例化 trait不能被实例化,没有实例化方法

注意点有同名的方法,当前类方法会覆盖 trait方法会覆盖继承类的方法

优先级 自己的类方法>trait方法>继承的父类方法

TP中的trait

父类控制器Controller中使用了Jump这个trait,提供了页面跳转相关方法

模型的softDelete这个trait,需要在自定义模型中,手动使用,提供的软删除相关功能

软删除

物理(硬)删除:真删除,从数据表直接删除记录。

逻辑(软)删除:假删除(本质是修改操作),只是让数据在页面不显示,数据表中仍然保留。

原理:在数据表添加一个字段控制数据在页面的展示。点击删除操作时,修改对应字段的值。

  • use traits\model\SoftDelete;
  • use SoftDelete;
  • use \traits\model\SoftDelete;
  • protected $deleteTime = 'delete_time';

只要加上了上面的内容 默认情况下就是软删除

  • //删除操作 软删除\app\admin\model\Goods::destroy($id);//真删除\app\admin\model\Goods::destroy($id,true);$goods= \app\admin\model\Goods::find($id);if(empty($goods)){ $this->error("数据已经不存在了");}//软删除$goods->delete();//真删除$goods->delete(true);//默认情况下删除成功跳转到当前页面 也就是列表页$this->success("删除成功");

day3下午

id参数检测

  • //id参数检测//大于0的整数if(!is_numeric($id) || $id===((int)$id) || $id<=0){ $this->error("参数错误");}if(!preg_match('/^\d+$/',$id) || $id==0){ $this->error("参数错误");}

密码加密函数

双重md5加密 外层md5加密加点盐 salt得固定 不然下次生成不一样

  • if(!function_exists('encrypt_password')){ //密码加密函数 function encrypt_password($string){ //加盐 得固定 php.拼接 $salt = 'gougeniubi'; return md5(md5($string).$salt); }}

Request-cookie-session

模板中使用

$Request.方法名.参数

  • {$Request.get.id}{$Request.param.name}
  • public function test_session(){ //设置 session('username','admin'); dump(session('username')); dump(session('?username')); //删除单个 session('username',null); dump(session('username')); //删除所有 session(null); //数组的用法 session('user',['id'=>1,'username'=>'admin']); dump(session('user.username')); session('user.email','admin@qqzmly.com'); dump(session('user')); /* string(5) "admin" array(3) { ["id"] => int(1) ["username"] => string(5) "admin" ["email"] => string(12) "admin@qqzmly.com" } */ session('user.email',null); dump(session('user')); //cookie cookie('name','zhangsan',3600); dump(cookie('name'));}

登录功能

  • //登录public function login(){ //一个方法 处理两个业务逻辑 页面展示 表单提交 if(request()->isPost()){ //表单提交 post请求 //接收参数 查询管理员用户表 //接收参数 username password code $params = input(); //参数检测 表单验证 $rule = [ 'username|用户名' =>'require', 'password|密码' =>'require', 'code|验证码'=>'require' ]; $res = $this->validate($params,$rule); if(true!==$res){ $this->error($res); } $password = encrypt_password($params['password']); //第一种写法两个where去查找 //$manager = \app\admin\model\Manager::where('username',$params['username']) // ->where('password',$password)->find(); //第二种批量查询 $manager = \app\admin\model\Manager::where(['username'=>$params['username'],'password'=>$password])->find(); //where查询会返回影响条数 if($manager){ //登录成功 设置登录标识到session中 session('manager_info',$manager->toArray()); //页面跳转 $this->success('登录成功','admin/index/index'); }else{ //登录失败 $this->error('用户名或密码错误'); } }else{ //get请求 页面展示 //临时关闭全局模板布局 $this->view->engine->layout(false); return view(); }}

退出功能

  • public function logout(){ //清空session session(null); $this->redirect('admin/login/login');}

登录检测功能

新建一个控制器

  • php think make:controller admin/Base --plain

Base控制器使用构造方法 其他的控制器继承Base Login登录页面不继承

  • class Base extends Controller{ public function __construct(Request $request = null) { //构造方法 实现父类的构造函数 parent::__construct($request); //登录检测 if(!session('?manager_info')){ //没登录 $this->redirect('admin/login/login'); } }}

验证码

没有安装THINKPHP自带的captcha就去安装 去项目根目录安装

  • composer require topthink/think-captcha=1.* 删除composer remove topthink/think-captcha 拓展composer require tp5/captcha
  • 'captcha' => [ // 验证码字符集合 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', // 验证码字体大小(px) 'fontSize' => 25, // 是否画混淆曲线 'useCurve' => true, // 验证码图片高度 'imageH' => 30, // 验证码图片宽度 'imageW' => 100, // 验证码位数 'length' => 5, // 验证成功后是否重置 'reset' => true],

点击图片换验证码

  • onclick="this.src='{:captcha_src()}?'+Math.random()"

字符串拼接一个随机数 这样避免同一地址资源文件 浏览器有缓存不去加载

验证码显示

  • <div>{:captcha_img()}</div><div><img src="{:captcha_src()}" alt="captcha" /></div>

控制器验证

使用TP5的内置验证功能,添加captcha验证规则即可

  • $this->validate($data,[ 'captcha|验证码'=>'require|captcha']);

或者手动验证

  • if(!captcha_check($captcha)){ //验证失败};//手动验证码校验if(!captcha_check($params['code'])){ $this->error('验证码错误');}

总结

1.修改操作以及后台商品修改功能(save方法、saveAll方法、静态update方法)

2.删除操作(delete方法、destroy方法)与软删除功能、trait

3.cookie 和 session 操作 (助手函数)

4.登录模块功能 (登录、退出、登录检测)

5.验证码( captcha_src() captcha_img() captcha_check() )

作业

1.商品修改、商品删除(软删除)、登录、退出、登录检测、验证码

2.管理员模块增删改查

注意点:

管理员列表:不显示密码

管理员添加:不做角色 用户名、密码(加密)、邮箱、昵称等

管理员修改:用户名不能修改 ,可以改密码(重置别人的密码)、邮箱、昵称等

管理员删除:不能删除admin管理员

修改密码 (修改自己的密码)

GouGe
程志辉 前行的路充满未知,不努力尝试,永远都不知道有多精彩。

发表评论