TP笔记5、模型 文件上传 分页 会话技术与验证码

1 模型

1.1 模型中的事务处理

public function test13(){
        $model=D('Goods');
        //开启事务
        $model->startTrans();

        $res1=$model->where('goods_id=4')->save(array('goods_name'=>'testAgain'));

        $res2=$model->where('goods_id=5')->save(array('goods_name'=>'testAgain'));
        if($res1!==false && $res2!==false){
            $model->commit();//提交事务
        }else{
            $model->rollback();//事务回滚
        }
    }

1.2 TP的连贯操作

  • 格式:模型对象->连贯方法->curd方法
public function test14(){
        $model=D('Goods');
        //where、field、alias、order、limit
        //field:指定需要的字段信息
        $model->field('goods_id,goods_name')->select();
        echo 'field:'.$model->getLastSql().'<hr>';
        //elias:指定表的别名
        $model->alias('a')->field('goods_id,goods_name')
        	->where('a.goods_id>5')->select();
        echo 'elias:'.$model->getLastSql().'<hr>';
        //order:指定排序方式
        $model->alias('a')->order('goods_id desc')->field('goods_id,goods_name')
        	->where('a.goods_id>5')->select();
        echo 'order:'.$model->getLastSql().'<hr>';
        //limit:限制条数
        $model->alias('a')->order('goods_id desc')->limit(2,3)
        	->field('goods_id,goods_name')->where('a.goods_id>5')->select();
        echo 'limit:'.$model->getLastSql().'<hr>';
    }

1.3 连表查询

使用join方法(连接方式、指定数据表、连接字段)

public function test15(){
        //join方法实现连表查询
        //join(连接方式、指定数据表、链接字段)
        $data=M('Stu')->alias('a')->field('a.*,b.class_name,b.class_room')->join('left join shop_class b on a.class_id=b.stu_id')->select();
        dump($data);
    }

在这里插入图片描述

1.4 TP使用原生SQL语句

  1. query:针对查询操作(select类型的SQL语句)。返回结果集
  2. execute:针对写入操作(添加、修改、删除)。返回受影响的行数
public function test16(){
        $model=M();
        $data=$model->query("select * from shop_stu");
        dump($data);
        $res=$model->execute("insert into shop_stu value(null,1,'吉喆R.I.P.')");
        dump($res);
    }

在这里插入图片描述

1.5 模型中的钩子函数

  • 数据操作(写入、删除、修改)时会自动触发钩子函数。
  • 钩子函数分前置和后置
  • 前置在操作前执行,后置即在操作后执行
操作 前置 后置
写入 before_insert after_insert
修改 before_updatet after_update
删除 before_delete after_delete
在IndexController.php中写入:
public function test17(){
        $model=D('Goods');
        $res=$model->add(array('goods_name'=>'testNike'));
    }
在GoodsModel.php中写入:
//数据写入的前置钩子函数
    public function _before_insert(&$data,$options){
        echo '_before_insert'.'<hr>';
        dump($data);
        dump($options);
    }

    //数据写入的后置钩子函数
    public function _after_insert($data,$options){
        echo '_after_insert'.'<hr>';
        dump($data);
        dump($options);
    }

在这里插入图片描述

2 TP文件上传

  • 源码地址:ThinkPHP\Library\Think\Upload.class.php
在add.html中写入:
<div class="formbody">
    <form action="" method="post" enctype="multipart/form-data">
        <ul class="forminfo">
            <li><label>商品名称<input name="name" type="text" class="dfinput" /><i>标题不能超30个字符</i></label></li>
            <li><label>图片价格<input name="goods_price" type="text" class="dfinput" /></label></li>
            <li><label>图片地址<input name="pic" type="file" class="dfinput" value="jklj"/></label></li>
            <li><label>内容<textarea name="body" cols="" rows="" class="textinput" ></textarea></label></li>
            <li><label>&nbsp;<input name="submit" type="submit" class="btn" value="保存"/></label></li>
        </ul>
    </form>
</div>
在GoodsController.php中写入:
 public function add(){
        if(IS_GET){
            $this->display();
        }else{
            //post表单提交
            $model=D('Goods');
            //定义自动完成规则
            $auto=array(
                array('addtime','time',1,'function')
            );
            $data=$model->auto($auto)->create();
            //$this->display();
            if(!$data){
                //说明目前有数据格式不满足要求
                //获取错误信息
                $this->error(($model->getError()));
            }
            $res=$model->add($data);
            if(!$res){
                //写入失败
                $this->error($model->getError());
            }
            $this->success('写入数据成功');
        }
    }
在GoodsModel.php中写入:
     //数据写入的前置钩子函数
        public function _before_insert(&$data,$options){
            //实现文件上传功能
            //1、实例化对象
            $config=array(
                'exts'=>array('jpg','gif'),//设置上传文件后缀限制
            );
            $upload=new \Think\Upload($config);
            //2、使用对象调用方法实现上传功能
            //关于文件上传根目录需要手动创建(在项目根目录创建Uploads目录)
            $info=$upload->uploadOne($_FILES['pic']);
            if(!$info){
                //说明文件上传失败
                 $this->error=$upload->getError();
                return false;
            }
            //将上传后的文件信息保存到$data中
             $data['goods_img']='Uploads/'.$info['savepath'].$info['savename'];
        }

  • 测试:
  1. 在add.html写入数据
    在这里插入图片描述

  2. 提交打印出信息
    在这里插入图片描述

  3. 数据表数据添加成功
    在这里插入图片描述

  4. 图片也保存成功
    在这里插入图片描述

3 TP分页功能

3.1 分页前提

在GoodsController.php中写入:
public function index(){
        $model=D('Goods');
        //获取所有商品信息
        $data=$model->select();
        $this->assign('data',$data);
        $this->display();
    }
在Admin\View\Goods\index.html中写入:
<table class="table">
    <thead>
    <tr>
        <th>编号</th>
        <th>商品名称</th>
        <th>图片信息</th>
        <th>发布时间</th>
        <th>内容</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    <volist name="data" id="vo">
        <tr>
            <td>{$vo.goods_id}</td>
            <td>{$vo.goods_name}</td>
            <td><img src="/{$vo.goods_img}" height="50" width="50"></td>
            <td>{$vo.addtime|date="Y-m-d H:i:s",###}</td>
            <td>{$vo.goods_body}</td>
            <td>
                <a href="#" class="tablelink">查看</a>
                <a href="#" class="tablelink">删除</a>
            </td>
        </tr>
    </volist>
    </tbody>
</table>

3.2 分页步骤

  1. 计算数据总数
  2. 实例化分页类
  3. 调用show方法计算分页导航
  4. 根据当前页码显示对应内容
修改GoodsController.php
public function index(){
        $model=D('Goods');
        //1、计算总记录数
        $count=$model->count();
        //2、实例化分页类对象
        $pagesize=2;//每一页显示数据条数
        $page=new \Think\Page($count,$pagesize);
        //3、使用对象调用show方法获取分页导航信息
        $show=$page->show();
        $this->assign('show',$show);
        //4、根据当前页,显示对应信息
        $p=I('get.p');//等价于$_GET['p'],获取当前页码
        //page方法可以根据当前页码以及每页显示条数自动计算偏移量
        $data=$model->page($p,$pagesize)->select();
        echo $model->getLastSql();
        //获取所有商品信息
        //$data=$model->select();
        $this->assign('data',$data);
        $this->display();
    }
在Admin\View\Goods\index.html中添加:
<div class="pagin">
    {$show}
</div>

在这里插入图片描述

4 TP中的会话技术

4.1 session

  1. session赋值
    session(‘name’,‘value’);//设置session
  2. session取值
    $value=session(‘name’);
    $value=-session(); //获取所有session信息
  3. session删除
    session(‘name’,null);
    session(null);//全部删除
//session设置操作
    public function sets(){
        session('goods_id','342');
        $_SESSION['name']='leo';//按照原生方式使用
    }
    public function gets(){
        dump(session());
    }
    public function delS(){
        session('goods_id',null);
    }

在这里插入图片描述

4.2 cookie

  1. cookie赋值
    session(‘name’,‘value’);//设置cookie
    session(‘name’,‘value’,3600);//指定cookie有效期
  2. cookie取值
    $value=cookie(‘name’);
  3. cookie删除
    cookie(‘name’,null);
    cookie(null);//清空当前设定前缀的所有cookie
    cookie(null,‘think_’);//清空指定前缀的所有cookie
//cookie设置操作
    public function setC(){
        //默认不指定有效时间,表示cookie关闭浏览器失效
        cookie('dirtyWord','damn','expire=3600');
    }
    public function getC(){
        dump(cookie('dirtyWord'));
    }
    public function delC(){
        cookie('dirtyWord',null);
    }

5 TP的验证码

  • 注意确保gd库开启
  • 步骤
  1. 实例化验证码对象
  2. 使用对象调用entry方法生成验证码
  3. 使用check方法检查验证码是否匹配
//生成验证码
    public function test18(){
        $config=array(
            'length'=>4,
        );
        $obj=new \Think\Verify($config);
        $obj->entry();
    }

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章