TP5框架基础知识总结

一、基础

1. 开启调试模式

修改应用配置文件( application/config.php )中的 'app_debug' => true,为了安全,在正式部署的时候一定要关闭调试模式。

2. 导入类库的方法

       这里使用了 use 来导入一个命名空间的类库,然后可以在当前文件中直接使用该别名而不需要使用完整 的命名空间路径访问类库。也就说,如果没有使用 use think\Controller; 就必须使用 class Index extends \think\Controller 这种完整命名空间方式。

二.Url和基本路由

    一般情况下,在url中模块名和控制器名是不区分大小写的,但如果使用驼峰法(HelloWord),则在url中必须使用hello_word来访问

     如果希望严格区分大小写访问(或者要支持驼峰法进行控制器访问),可以在应用配置文件中设置: // 关闭URL自动转换(支持驼峰访问控制器) 'url_convert' => false,

 (2)参数的传入

   在访问url时有三种方法

   1》变量1/value/变量2/value

   2》变量1/变量2/value1/value2

   3》url?变量1=value1&变量2=value2

注意:如果在配置文件里面设置了按照参数顺序获取 'url_param_type' => 1,

  1》和2》的访问方式会拿到变量1/value分别复制给两个参数

  但是3》的访问方式仍然可以得到正确答案

(3) 定义路由

 我们在路由定义文件( application/route.php )里面添加一些路由规则,如下:

代表以hello开头的所有访问都可以路由到

 hello/:name=>index\index\hello;

  代表name参数是可选参数

 hello/[:name]=>index\index\hello;

  代表完整匹配,只能匹配到index模块下面的index控制器下面的hello方法

hello/[:name]$=>index\index\hello;

(4) 定义闭包

  hello/[:name]=>function($name)

{

    Echo welcome!.$name;

}

 http:localhost\tp5\hello\thinkphp;

三.向模板分配变量

一. 模板中包含文件

{include file="Common/header" title="哈哈"}<!-- header是模板名称 -->

 <h1>ThinkPHP欢迎您!</h1>

{include file="index@Common/footer"}

(1)/*单独分配一个变量*/

    $this->assign('name','Alice');

(2) /*分配多个变量*/

/*方法一*/

    $this->assign([

    'name'=>'Alice',

        'sex'=>'女',

        'age'=>19

    ]);

   return $this->fetch('index');

/*方法二*/

    return $this->fetch('index',[

       'name'=>'Alice',

        'sex'=>'女',

        'age'=>19

    ]);

 (3)$v=new View();

//分一维数组*/

$data=array('a1','a2','a3');

$v->arr=$data;

/*分配一维关联数组*/

$data2['name']="吉吉";

$data2['sex']="女";

$v->arr2=$data2;

/*分配简单变量

$v->name='haha';

/*分配多维数组*/

$data3=array(

              'a1'=>array(1000,'a'),

              'a2'=>array(1001,'b'),

              'a2'=>array(1002,'c')

);

        $v->arr3=$data3;

        /*分配对象*/

        $obj=new View();

        $obj->name="尜尜";

        $obj->sex="男";

        $v->obj=$obj;

return $v->fetch('index');

模板中获取分配的数组以及对象

          {$arr[0]}-{$arr[1]}-{$arr[2]}<br/>

<!-- 关联数组解析 -->

<!-- 方法一 -->

{$arr2['name']}----{$arr2['sex']}<br/>

<!-- 方法二 -->

{$arr2.name}----{$arr2.sex}

<hr>

<!-- 获取多维数组 -->

<!-- 方法一 -->

{$arr3['a2'][0]}<br/>

<!-- 方法二 -->

{$arr3.a1[1]}

<hr>

<!-- 获取分配过来的对象的内容 -->

{$obj->name}

四.模板中的比较标签

<h1><font color="blue">一.比较标签</font></h1>

<!--

  (1)等于eq

  (2)大于gt

  (3)大于等于egt

  (4)小于lt

  (5)小于等于elt

  (6)不等于neq

  (7)恒等于heq

  (8)不恒等于nheq

 -->

 <!-- 所有的比较标签用法都一样,区别就是判断条件不同,而且他们都能和else标签一起使用

      而且对于所有的类型,name和value的赋值必须要加双引号!!!!!

 -->

<!-- 当name的值大于value的值时输出相等,也可以和else混合使用-->

1.{eq name="$a" value="12"}

相等

{else/}

不相等

{/eq}

<hr>

<!-- 当name的值大于value的值 -->

2.{gt name="$a" value="5"}111{/gt}

<!-- 当name的值大于等于value的值 -->

3.{egt name="$a" value="5"}2222{/egt}

<!-- 判断一个恒等 -->

4.{heq name="$a" value="12"}

    恒等于

   {else/}

    不相等

  {/heq}

<hr>

<!-- 比较标签中的变量可以支持对象的属性或者数组,甚至可以是系统变量 -->

<!-- 用对象的属性进行判断 -->

1.{eq name="obj->a" value="12"}

{$obj->a}

{else/}

不相等

{/eq}

<hr>

<!-- 用数组进行判断 -->

2.{eq name="arr[2]" value="12"}

{$arr[2]}

{else/}

不相等

{/eq}

<hr>

<!-- 所有的比较标签可以统一使用compare标签(其实所有的比较标签都是compare标签的别名),例如: 当name变量的值等于5就输出 ,其中type属性的值就是比较标签名称!!!!

-->

{compare name="$a" value="13" type="heq"}

相等

{else/}

不相等

{/compare}

<hr >

<h1><font color="blue">二.标签的嵌套?????</font></h1>

<!-- 解释volist标签 -->

<!--

属性:

1.name(必选):要输出的数据模板变量

2.id(必须):循环变量

3.offset(可选):要输出数据的offset  

4.length(可选):输出数据的长度

5.key(可选):循环的key变量,默认值为1  

6.mod(可选):对key值取模,默认值为2  

7.empty(可选):如果数据为空显示的字符串  

 -->

<h1><font color="blue">三.条件判断</font></h1>

<!-- 1.switch标签  用法-->

<!-- 其中name属性可以是系统变量也可以是函数

     对于case的value属性可以支持多个条件的判断,使用”|”进行分割,例如:

          value="gif|png|jpg" 图像格式

     也可以对case的value属性使用变量,例如:

          value="$adminId"

     使用变量方式的情况下,不再支持多个条件的同时判断。      

 -->

{switch name="$a"}

 {case value="12"} 相等{/case}

 {case value="13"} 小于value的值{/case}

 {case value="10"}  大于value的值{/case}

 {default/}这是默认情况

{/switch}

<hr >

<!-- 2.if条件判断  if条件存在condition-->

{if condition="($a == 1222) OR ($a < 0) "}

    符合条件

{elseif condition="$a eq 12"/}

  这是elaeif的条件输出语句

{else /}

 以上条件不满足

{/if}

<hr >

 <!-- condition属性可以支持语法和对象语法 -->

 {if condition="$obj->a neq '12'"}

      呀!不想等额

    {else/}

      {$obj->a}

 {/if}

<hr>

 {if condition="$arr2.a1[1] neq 'a'"}

    不相等

    {else/}

    {$arr2.a1[1]}

 {/if}

 <hr color="yellow">

<h1><font color="blue">四.范围判断</font></h1>

 <!-- name属性还支持直接判断系统变量;value属性还可以使用系统变量 -->

 <!-- value属性也可以使用变量,该变量可以是数组也可以是逗号分隔的字符串 -->

 

<!-- 1.用in标签来判断模板变量是否在某个范围内 -->

{in name="a" value="1,2,13"}

    a在范围内

  {else/}

    a不在范围内

{/in}

<hr>

<!-- 2.使用notin标签来判断模板变量是否不在某个范围内 -->

{notin name="a" value="1,11,111"}

      a不在范围

{/notin}

 <hr>

 <!-- 3使用between来判断模板变量是否在某个区间内 -->

 <!-- 4.使用notbetween来判断模板变量是否不在某个区间内 -->

注意:当使用between标签的时候,value只需要一个区间范围,也就是只支持两个值,后面的值无效,例如:1,3,10,实际判断的范围区间是1~3,而不是1~10!!!!也可以支持字符串判断<br>

<!-- name属性可以直接使用系统变量,value属性也可以使用变量,变量的值可以是字符串或者数组,还可以支持系统变量。

 -->

 <!-- 可以使用range标签替换前面两种范围判断的标签 -->

 {range name="a" value="1,12,11,13" type="in"}

     a在范围内

 {/range}

 <hr>

 <!-- present标签用来判断name后面那个模板变量是否赋值,相应有notpresent -->

 <!-- name属性可以使用系统变量 -->

{present name="c"}

c已经赋值

{else /}

c还没有赋值

{/present}

<!--

1.empty标签用于判断某个变量是否为空,如果判断没有赋值可以使用notempty,name属性可以直接使用系统变量

2.defined标签用于判断某个常量是否有定义,相应的有notdefined

  注意!:name属性的值要注意严格大小写

 -->

<h1><font color="blue">五.循环输出标签</font></h1>

 <!-- volist标签 -->

 <!-- name属性表示模板赋值的变量名称,不可随意更改 -->

 <!-- id可随意更改,只要不和name属性冲突 -->

<!-- 1.循环遍历写法1-->

<table border="1px">

{volist name="list" id="vo"}

<tr>

  <td>{$vo.id}</td>

  <td>{$vo.data}</td>

</tr>

{/volist}

</table>

<!-- (1)支持输出查询结果的部分数据 -->

<!--

1.offset是指从第几条记录开始打印查询结果,length表示打印多少条,是代表一个长度

 -->

<table border="1px">

{volist name="list" id="vo" offset='4' length='5'}

<tr>

  <td>{$vo.id}</td>

  <td>{$vo.data}</td>

</tr>

{/volist}

</table>

<hr color="green">

<!--

用遍历的行的索引对mod的值取余,可以使用eq函数来判断余数和eq的value值,相等时执行相应的操作

 -->

{volist name="list" id="vo" mod="5"}

  {$vo.id}

  {eq name="mod" value="2"}

  <br/>

  {/eq}

{/volist}

<hr color="pink">

<!-- 输出循环变量 -->

<!-- $k由循环来决定,第一次循环k的值为1,以此类推 -->

{volist name="list" id="vo" key="k" }

{$k}.{$vo.data}<br>

{/volist}

<hr>

<!--如果没有指定key属性的话,默认使用循环变量i,  -->

{volist name="list" id="vo"  }

{$i}.{$vo.data}<br>

{/volist}

<hr>

<!-- 如果要输出数组的索引,可以直接使用key变量,和循环变量不同的是,这个key是由数据本身决定,而不是循环控制的 -->

{volist name="list" id="vo"  }

{$key}.{$vo.data}<br>

{/volist}

<hr color="yellow">

<!-- 2.循环遍历写法2使用foreach循环遍历 -->

1.方法1<br>

{foreach $list as $v}

 {$v.id}:{$v.data}<br>

{/foreach}

<hr>

2.方法2<br>

<!-- name表示数据源 item表示循环变量 -->

{foreach name="list" item="v"}

 {$v.id}:{$v.data}<br>

{/foreach}

<hr>

3.方法3:可以定义索引的变量名<br>

{foreach name="list" item="vo" key="k" }

  {$k}.{$vo.data}<br>

{/foreach}

<hr>

4.方法4:可以输出索引<br>

{foreach name="list" item="vo" }

  {$key}.{$vo.data}<br>

{/foreach}

<hr color="red">

<!-- for标签 -->

{for start="1" end="19"}

 {$i}

{/for}

<!-- 解析后的代码 -->

<!-- for ($i=1;$i<100;$i+=1)

{

   echo $i;

}

 -->

五.查询构造器

<?php

namespace app\index\controller;

use think\Controller;

use think\View;

use think\Db;

use think\Request;

class Demo

{

public function index()

{   

/*单行查询,find只能用单行查询*/

/*$data = Db::name('data')->find();

 echo "<pre>";

    print_r($data) ;

    echo "</pre>";*/

/*简单查询方法*/

/*1.使用where方法多字段查询*/

/*$data =DB::table("think_data")

  ->where('id','like','2')

  ->where('data','php')

  ->find();*/

/*2.多字段相同的and查询简化操作*/

   /*有多行结果使用select*/

   /* $data=DB::table('think_data')

    ->where('data&id','like','%2%')

    ->select();*/

    

/*3.使用whereOr方法多字段查询*/

  /*使用find()只能查询到一行数据使用select()会将数据库中的所有符合条件的行全部查到*/

  /* $data=DB::table('think_data')

    ->where('data','like','%2%')

    ->whereOr('id','like','%2%')

    ->find();

  $data=DB::table('think_data')

    ->where('data','like','%2%')

    ->whereOr('id','like','%2%')

    ->select();*/

/*使用whereOr查询的简化操作*/

    /*$data=db::table('think_data')

        ->where('data|id','like','%2%')

    ->select();*/

        

    /*复合查询,where和whereor混合使用*/

   /*  $result=db::table("think_data")

     ->where(function($query){

       $query->where('id','like','1')

       ->whereor('id','like','12');

     }) ->whereor(function($query){

      $query->where('data','like','think')

       ->whereor('data','like','%d%');  

     })

     ->select();*/

        

    /*获取think_data表的所有信息*/

        /*

             'fields':获取`think_data`表所有字段

              type':获取`think_data`表所有字段的类型

              'pk':获取`think_data`的主键

        */

   /* $data=Db::getTableInfo('think_data');*/

/*查询数据*/

    /*查询一个数据使用find(),查询结果不存在返回null*/

    /*查询数据集使用select(),查询结果不存在返回一个空数组*/

    /*默认情况下find和select方法返回的都是数组*/

   /*1.助手函数??????????????????????????????????????*/

   /*$data=db('think_data')->where('id',12)->find();*/

   

   /*2.使用query对象或者闭包查询*/

   /*$query=new \think\Db\Query();

   $query->table('think_data')->where("id",12);

   $data=Db::find($query);*/

    

/*值和列查询*/

 /*  $data=Db::table('think_data')->where('id',1)->column('data');*/

   

/*3.使用批量查询*/

     /* $data=Db::table('think_data')

      ->where([

        'id'=>['like','%2%'],

        'data'=>['like','%d%']

       ])

     ->select();

       echo "<pre>";

   print_r($data) ;

   echo "</pre>";*/

/*数据表的更新操作*/

  /*更新数据表,返回影响行数,无任何更新返回0*/

  /*$data=Db::table('think_data')

  ->where('id','1')

  ->update(['data'=>'linux']) ;*/

/*将数据库中某个字段的时间修改为现在的时间,使用now()函数*/

  /*$data=Db::table('think_data')

  ->where('id','1')

  ->update([

     'time'=>['exp','now()']

   ]);*/

 

/*修改某个字段的值 ,返回影响数据的条数*/

 /*$data=Db::table('think_data')

    ->where('id',22)

  ->setField(['data'=>'linux2']);*/

/*

  自增或自减一个字段的值

   setInc/setDec 如不加第二个参数,默认值为1

   setInc/setDec 方法返回影响数据的条数

*/

    /*$data=Db::table('think_data')

    ->where('data','linux')

    ->setInc('id','3');*/

  

/*使用助手函数更新数据库??????????????????????????*/

/*$data=db('user')->where('id',72)->update(['data' => 'thinkphp11111']);*/

/* return $data;*/

/*聚合查询*/

// count 统计数量,参数是要统计的字段名(可选)

// max 获取最大值,参数是要统计的字段名(必须)

// min 获取最小值,参数是要统计的字段名(必须)

// avg 获取平均值,参数是要统计的字段名(必须)

// sum 获取总分,参数是要统计的字段名(必须)

/*$data=Db::table('think_data')->max('id');

 */

/*删除数据*/

// 根据主键删除

/*$data=Db::table('think_data')->where('id','82')->delete();

return $data;

*/// 根据条件删除

/*添加数据*/

// 添加一条数据

/*$data = ['data' => 'bar', 'time' => '2019-12-12'];

$res=Db::table('think_data')->insert($data);*/

/*$data = ['data' => 'b', 'time' => '2018-12-12'];*/

// getLastInsID方法添加数据成功返回添加数据的自增主键

/*Db::table('think_data')->insert($data);

$userId = Db::table('think_data')->getLastInsID();*/

// 或者直接使用insertGetId 方法新增数据并返回主键值:

/*$userId =Db::table('think_data')->insertGetId($data);*/

// 添加多条数据

/*$data=[

   ['data' => 'b', 'time' => '2018-12-12'],

    ['data' => 'f', 'time' => '2018-12-12'],

     ['data' => 'g', 'time' => '2018-12-12'],

      ['data' => 'h', 'time' => '2018-12-12']

];

$userId=Db::table('think_data')->insertAll($data);

return $userId;*/

 原生查询

// Db类支持原生SQL查询操作,主要包括下面两个方法:

/*query方法*/

/*query方法用于执行SQL查询操作,如果数据非法或者查询错误则返回false,否则返回查询结果数据集(同select方法)。*/

/*$data=Db::query("select * from think_data ");

       echo "<pre>";

   print_r($data) ;

   echo "</pre>";*/

// execute方法

// execute用于更新和写入数据的sql操作,如果数据非法或者查询错误则返回false ,否则返回影响的记录数。

// 修改

/*$data=Db::execute("update think_data set data='thinkphp' where id=86");

*///删除

/*$data=Db::execute("delete from think_data where id =87");

var_dump($data); */

// 排序和limit

/*$data=Db::table('think_data')->order('id desc')->limit(5)->select();*/

// page,第一个参数代表第几页

/*$data=Db::table('think_data')->page('3,3')->select();*/

// field方法 代表查询的结果集中都包含那些字段

/*$data=Db::table('think_data')->field('id')->select();*/

// group方法

/*$data=Db::table('think_data')

   ->field('max(id),data')

   ->group('id')

   ->select();

       echo "<pre>";

   print_r($data) ;

   echo "</pre>";*/

}

public function hello(Request $request)

{

// 控制器中获取参数

return $request->param('a');

}

}

六.模型层的增删改

  模型层:

<?php

namespace app\admin\model;

use think\Model;

// 当我们起的类名和我们数据库中的表名一致的话当然会自动找到,但是

//如果不一致的话,我们可以手动去关联一下,

// 方法一:如果在database.PHP配置文件中配置了表的前缀,我们只需要给个表名,$name假设是成员属性

/*procect $name='user'*/

// 方法二:包含前缀

/*protect $table='tp_user'*/                          

/*因为所有的方法都在MODEL类里面,必须要继承一下*/

class Book extends Model{}

<一>增删改

   /*数据单行插入一*/

     // 首先实例化Users对象

    /*$user=new Users();

   $user->userName="小鹏";

   $user->userPwd="12344";

   $user->userEmail="[email protected]";*/

   return ($user->save());//save()的返回值是受影响行数

/*数据单行插入二*/

    //返回值是一个数组,该数组包括该行信息的所有

   $data['userName']="小红";

   $data['userPwd']="12344";

   $data['userEmail']="[email protected]";

   $res=Users::create($data);

   return dump($res);

/*数据的批量插入*/

   // 首先实例化Users对象

  /* $u=new Users();

   $data=[

                ['userName'=>'qq','userPwd'=>11,'userEmail'=>"[email protected]"],

                ['userName'=>'ww','userPwd'=>11,'userEmail'=>"[email protected]"],

                ['userName'=>'com','userPwd'=>11,'userEmail'=>"[email protected]"]

   ];

   $res=$u->saveAll($data);

   return dump($res);*/

/*数据的更新操作一*/

    // 返回受影响的行数

     /*首先使用get方法获取到你要更改的数据信息*/

    /*$user=Users::get(1007);

     $user->userName="仙女";

     $res=$user->save();

     return dump($res);*/

/*数据更新操作二*/

    // 返回数组类型

     /* $data['userName']="大仙女";

      $res=Users::update($data,['userId'=>1003]);

      return dump($res);*/

/*数据的删除一*/

    // 返回受影响的行数

     /* $data=Users::get(1007);

        $res=$data->delete();

        return $res;*/

/*数据的删除二*/

    // 返回受影响的行数

     /*$res=Users::destroy(1003);

     return $res;*/

}

<二>查

/*根据主键值的查询*/

     $res=Users::get($id);

     return $res->userName;

/*根据某个字段的值查询*/

     $res=Users::get(['userName'=>'小鬼']);

     return $res->userName;

/*使用where条件指定*/

   /*$res=Users::where(['userId'=>$id])->find();

   return $res;*/

   /*$res=Users::where('userId',$id)->find();

   return $res;*/

//这里我们可以使用数组的形式访问对象属性,

//这是因为父类Model实现了\ArrayAccess接口

     /* $res=Users::where('userId',$id)->find();

     return $res['userName'];*/

//使用getByXXX方法根据表中的某个字段的值进行查询

     /*$res=Users::getByusername('妮妮');

     return $res['userId'];*/

// 数据的多行查询

    /* $res=Users::all();

     return dump($res);*/

     $res=Users::all(['type'=>'计算机']);

     $res=Users::where('username','like','%秀%')->select();

六.会话机制

      使用redirect()函数实现tp5中页面的跳转

1》Cookie

 1)设置Cookie使用Cookie::set()或者使用助手函数Cookie()

 2)判断Coookie是否存在使用Coookie::has();

  (3)获取Cookie的值使用Coookie::get();

  (4)清除Coookie使用Coookie::delete();或者使用助手函数Coookie(‘’,null)

2》Session

 1)设置Session使用Session::set()或者使用助手函数Session()

 2)判断Session是否存在使用Session::has();

  (3)获取Session的值使用Session::get();

  (4)清除Session使用Session::delete();或者使用助手函数Session(‘’,null)

3》tp5中的分页

  1)每页显示3条数据

  $data=Db::table('book')->paginate(3);

3)查询总条数

     $totalnum=Db::table('book')->count();

在模板中只需要这个函数就可以显示分页

{$booklist(分配过来的$data)->render()}

4》tp5中的图片上传

 

Index.html

   <form id="sc" action="{:url('uploadprocess')}"  method="post" enctype="multipart/form-data" target="shangchuan">

   <input type="file" name="myfile" value="" />

   <input type="submit" value="点击上传">

</form>

'uploadprocess'方法

  /*实现上传逻辑*/

   public function uploadProcess()

   {

   $request=request();

   // 获取表单上传文件

   $fileobj=$request->post('myFileName');

   /*dump($res);*/

   // 移动到框架应用根目录/public/uploads/ 目录下

   $info=$fileobj->move(ROOT_PATH.'public'.DS.'uploads');

   if($info)

   {

      // 上传成功,

   // 方法一:只获取文件信息获取到图片的名称 1686c673f9f50197de9b2ea36277b4c5.jpg

   /* return $info->getFilename();*/

   // 方法二:获取到uploads下面的文件夹以及图片名称 20180402\1686c673f9f50197de9b2ea36277b4c5.jpg

     $this->assign('filename',$info->getSavename());

     return $this->fetch('uploadprocess');

   }else{

   // 上传失败,获取错误信息

     return $file->getError();

   }

   }

 

5》tp5中验证码使用

 

<input type="text" name="Code" id="code" placeholder="请输入验证码"><img src="_STATIC_yzm/vdimgck.php" onclick="this.src=this.src+'?'">


猜你喜欢

转载自blog.csdn.net/I_am_lonely/article/details/80487128