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();
    }

在這裏插入圖片描述

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