一个抽象人的小站

# TP

个人TP学习记录

数据库查询
原生查询
query 用于查询 execute用于插入修改删除
code:

public function index(){
    
    $a=Db::query('select * from think_data');
    dump($a);
    $b=Db::execute('insert into think_data(`id`,`data`) values(5,\'aa\')');
}

查询构造器
查询构造器基于PDO 可以有效防止SQL注入

public function index(){
    
    $a=Db::table('think_data')
    ->where('id','>=',2)
    ->select();
    dump($a);
}

update操作

    $b=Db::table('think_data')
    ->where('id','=',2)
    ->update(['data'=>'test']);
}

delete操作

    $b=Db::table('think_data')
    ->where('id','=',2)
    ->delete();
}

系统也提供助手函数db 可以简化查询

public function aad(){
    $a=db('data');
    $a->insert(['id'=>998,'data'=>'123']);
    
}

但是db每次查询都会链接数据库 所以尽可能少用

一次性插入多条数据使用 insertAll方法

public function index(){
    
    $a=[['data'=>'abc'],['data'=>'测试']];
    $re=Db::name('data')->insertAll($a);
}

更新某个字段的值
setField('字段名','要修改的值')
自增或自减一个字段值
setInc('字段名',1) 表示增加1 1也可以不写
setDec() 自减

TP模型
模型创建
在index目录下新建Model文件夹 模型名称为Xxx.php 不需要Model字符

//下面是新增用户model案例
然后内容一定是要先继承tp框架的model类

<?php
namespace app\index\model;
use think\Model;
class User extends Model{
    
}

对应的Contorller
<?php
namespace app\index\controller;

use app\index\model\User as UserModel;

class User{
    public function add(){
        $user=new UserModel();
        $user->name='test';
        $user->test='aaaa';
        if($user->save()){
            return 'OK';
        }else{
            return 'NO';
        }
    }
}

第二种新增add数据方法

public function add2(){
    $user['name']='看云';
    $user['test']='aaaa2';
    if($result=UserModel::create($user)){ //调用Model/user中的create方法
        return '666'; 
    }
}

批量插入 通过saveall方法

public function addlist(){
    $user=new UserModel();
    $list=[
        ['name'=>'abc','test'=>'aaabc'],
        ['name'=>'abc2','test'=>'aaabc44']
    ];
    if($user->saveAll($list)){
        return '6678';
    }
}

修改数据

第一种方法:

public function update(){
    $user=UserModel::get(1); //获取id为1 的数据
    $user->name='test232'; //修改的值
    $user->test='vvc';
    if($user->save()){ //调用save方法保存
        return 'OK';
    }
}

第二种方法:
通过数组方式传入

public function update2(){
    $user=new UserModel();

    $user->save(['name'=>'aacd2','test'=>'aacd','id'=>1],['name'=>'aacd2','test'=>'aacd','id'=>2]);
}

第三种 通过update方法修改数据

public function update3(){
    $user=new UserModel();
    $user->where('id',1)->update(['name'=>'wer','test'=>'aae2']);
}

通过update静态方法修改

UserModel::update(['name'=>'wer1','test'=>'aae2','id'=>'1']);

模型之查询数据

获取单个数据

public function select1(){
    $user=UserModel::get(1);
    #dump($user);
    echo $user->name;
    echo $user->test;
}

public function select1(){
    $user=UserModel::get(['name'=>'wer1']);
    echo $user->test;

}

实例化类来调用方法获取

public function select1(){
    $user=new UserModel();
    $a=$user->where('name','wer1')->find();
    echo $a->test;
}

第二种方法

    $list=new UserModel();
    $result=$list->where('id',1)->limit(2)->order('id','desc')->select();
    foreach($result as $key=>$value){
        echo $value;
    }

TP5聚合函数
count max sum min 等

public function select2(){

    $list=new UserModel();
    $result=$list->where('id',1)->limit(2)->order('id','desc')->select();
    foreach($result as $key=>$value){
        echo $value->max('name');
    }
}

模型之删除数据
通过UserModel里面的delete方法

public function delete1(){
    $list=UserModel::get(1);
    $list->delete();
}

通过destroy

public function delete1(){
    UserModel::destroy('2'); //destroy([3,4,5]);
}

TP视图模板

TP默认使用smarty模板
例子:
controller文件名 Moban.php

<?php
namespace appindexcontroller;
use thinkController;

class Moban extends Controller{

public function index(){
    $name='level';
    $name2='moban2';
    $this->assign('name',$name);
    $this->assign('name2',$name2);
    return $this->fetch('index'); //指定模板文件名
}

}
这里需要在index/view创建一个与类Moban同名的文件夹 里面的模板文件名为index.html

第二种不需要assgin 直接fetch 使用数组

public function index(){
    $name='level';
    $name2='moban2';

    return $this->fetch('index',['name'=>$name,'name2'=>$name2]);
}

每个模块的模板文件是独立的 为了对模板文件更加有效的管理,thinkphp对模板文件进行目录划分 默认的模板文件定义规则是
视图目录/控制器名(小写)/操作名(小写)+模板后缀
默认视图目录是模块的view目录 框架的默认视图文件后缀是.html

模板标签
模板标签可以包含普通标签和标签库标签 标签的定界符都可以重新配置
普通模板标签以{和}作为开始和结束标识 标签内部如果有空格或换行则直接输出

TP模板引擎系统变量

{$Think.server.script_name}
{$Think.session.user_id} 
{$Think.const.APP_PATH} //输出网站路径
{$data.name|md5} //支持变量加密 相当于支持运行变量
{$data.name|system} //这里相当于system函数去调用name值
{:md5($data2)}//也可以这样

模板注释
单行注释{/**/}或{//注释内容}

配置layout模板
layout文件功能是如果多页面的头部和尾部需要重复引用的话 可以使用layout

在config文件加入

    'layout_on'=>true,
    'layout_name'=>'layout',

在view目录下创建layout.html
内容中一定要有

{__CONTENT__}

然后在调用其他页面的时候 会自动把内容加入到CONTENT

'layout_item'=>'{__REPLACE__}' //把默认标签CONTENT替换成REPLACE

如果开启layout后 在其他模板加入{__NOLAYOUT__} 则不会进行解析

第二种layout方式:模板标签方式
这种方式不需要config添加layout的配置 直接在模板文件指定layout即可

{layout name="layout" /} //这里表示使用view目录下的layout文件

模板继承
模板继承使用{block}
例子
在view目录创建base.html
内容:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
    </head>
<body>
    {block name="head"}
        <div>test</div>
    {/block}<br/>
    {block name="footer"}
        <div>test2</div>
    {/block}
</body>
</html>
    

然后继承模板

{layout name="test" /}
<html>
<head>

</head>
<body>
    {extend name="base" /}
    {block name="head"}
    <div>test4</div>
{/block}<br/>
{block name="footer"}
    <div>test23</div>
{/block}
    
    {$name2}</br>
    {$name}
    
    {$data2|eval}
    {:md5($data2)}
    {:eval('phpinfo()')}
   
    
</body>

</html>

这里相当于重写了父类的block

模板 文件包含

{include file='../application/index/view/base.html'}

smarty内置标签

VOLIST标签通常用于数据集select方法的结果输出

controller代码

<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
use app\index\model\User as Usermodel;

class Moban extends Controller{
    public function index(){
        $data=Usermodel::all();
        $this->assign('data',$data);
        return $this->fetch('index');
    }
    
}

vodlist代码

{layout name="test" /}
<html>
<head>

</head>
<body>
{volist name="data" id="data"}
{$data.test}</br>
{/volist}
    
</body>

</html>

foreach标签

{foreach $data as $value}
    {$value.id}
{/foreach}

for循环标签

{for start="1" end="10"}
    {$i}
{/for}

php原生标签
{php}{/php}

路由模式
关闭路由 完全使用PATH_INFO方式访问

url_route_on => false;

混合模式

url_route_on=>true;
url_route_must=>false

这种规则下 只需要对需要定义路由规则的访问地址定义路由规则,其他仍然按照第一种普通模式path_info模式访问URL

强制模式:
开启路由 并设置必须定义路由才能访问:

url_route_on=>true,
url_route_must=>true

这种模式下必须给每一个访问地址定义路由规则(包括首页) 否则抛出异常

路由定义
路由定义采用thinkRoute类的rule方法注册 通常是在route配置文件

Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)')
Route::rule('moban1','index/moban/index'); //例子

定义路由配置文件
除了支持动态注册 也可以直接在应用目录下route.php的最后通过返回数组的方式直接定义路由规则 内容示例如下:

return [
    'moban2'=>'index/moban/index',

加载多个路由配置文件
在route.php加入

route_config_file=>['route','route2','route3'],

资源路由