一、基础
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="哈哈"}
ThinkPHP欢迎您!
{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]}
{$arr2['name']}----{$arr2['sex']}
{$arr2.name}----{$arr2.sex}
{$arr3['a2'][0]}
{$arr3.a1[1]}
{$obj->name}
四.模板中的比较标签
一.比较标签
1.{eq name="$a" value="12"}
相等
{else/}
不相等
{/eq}
2.{gt name="$a" value="5"}111{/gt}
3.{egt name="$a" value="5"}2222{/egt}
4.{heq name="$a" value="12"}
恒等于
{else/}
不相等
{/heq}
1.{eq name="obj->a" value="12"}
{$obj->a}
{else/}
不相等
{/eq}
2.{eq name="arr[2]" value="12"}
{$arr[2]}
{else/}
不相等
{/eq}
{compare name="$a" value="13" type="heq"}
相等
{else/}
不相等
{/compare}
{switch name="$a"}
{case value="12"} 相等{/case}
{case value="13"} 小于value的值{/case}
{case value="10"} 大于value的值{/case}
{default/}这是默认情况
{/switch}
{if condition="($a == 1222) OR ($a < 0) "}
符合条件
{elseif condition="$a eq 12"/}
这是elaeif的条件输出语句
{else /}
以上条件不满足
{/if}
{if condition="$obj->a neq '12'"}
呀!不想等额
{else/}
{$obj->a}
{/if}
{if condition="$arr2.a1[1] neq 'a'"}
不相等
{else/}
{$arr2.a1[1]}
{/if}
{in name="a" value="1,2,13"}
a在范围内
{else/}
a不在范围内
{/in}
{notin name="a" value="1,11,111"}
a不在范围
{/notin}
注意:当使用between标签的时候,value只需要一个区间范围,也就是只支持两个值,后面的值无效,例如:1,3,10,实际判断的范围区间是1~3,而不是1~10!!!!也可以支持字符串判断
{range name="a" value="1,12,11,13" type="in"}
a在范围内
{/range}
{present name="c"}
c已经赋值
{else /}
c还没有赋值
{/present}
五.循环输出标签
{$vo.id} | {$vo.data} |
{$vo.id} | {$vo.data} |
{volist name="list" id="vo" mod="5"}
{$vo.id}
{eq name="mod" value="2"}
{/eq}
{/volist}
{volist name="list" id="vo" key="k" }
{$k}.{$vo.data}
{/volist}
{volist name="list" id="vo" }
{$i}.{$vo.data}
{/volist}
{volist name="list" id="vo" }
{$key}.{$vo.data}
{/volist}
1.方法1
{foreach $list as $v}
{$v.id}:{$v.data}
{/foreach}
2.方法2
{foreach name="list" item="v"}
{$v.id}:{$v.data}
{/foreach}
3.方法3:可以定义索引的变量名
{foreach name="list" item="vo" key="k" }
{$k}.{$vo.data}
{/foreach}
4.方法4:可以输出索引
{foreach name="list" item="vo" }
{$key}.{$vo.data}
{/foreach}
{for start="1" end="19"}
{$i}
{/for}
五.查询构造器
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 "
";";*/print_r($data) ;
echo "
/*简单查询方法*/
/*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 "
";";*/print_r($data) ;
echo "
/*数据表的更新操作*/
/*更新数据表,返回影响行数,无任何更新返回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 "
";";*/print_r($data) ;
echo "
// 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 "
";";*/print_r($data) ;
echo "
}
public function hello(Request $request)
{
// 控制器中获取参数
return $request->param('a');
}
}
六.模型层的增删改
模型层:
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
'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中验证码使用
his.src=this.src+'?'">