面包屑思维模型实战模型错题集结构手册流程手册自我检测专题模块
-
微信小程序前端微信小程序前端易错点收集查看
-
css/less/sass样式控制在开发过程中的一些样式控制bug规避查看
-
tp5开发小程序tp5开发小程序时错误积累查看
-
PHP错题集PHP在实际开发过程中遇到的问题查看
-
MySql数据库使用MySql在实际开发中遇到的错误总结查看
-
TP5错题集积累tp5框架在实际开发过程中遇到的问题查看
-
uni-app爬坑主要用于uni-app项目中遇到的一些问题查看
-
Vue.js易错收集vue.js项目常见错误收集整理查看
-
uni-app开发微信小程序uni-app开发微信小程序的一些爬坑积累查看
-
LinuxLinux在部署、开发、运维时遇见的错误积累查看
-
安全设计常见安全设计查看
-
Redis项目中使用redis的相关错误积累查看
-
前端特效前端特效相关错题集查看
最新博文
-
模型调用
thinkphp模型类主要可以使用静态调用或者实例化调用两种方式,当然,还有Loader加载类和url助手函数,例如:
一.静态调用
// 静态调用 $user = User::get(1); $user->name = 'thinkphp'; $user->save();
二.实例化调用
// 实例化模型 $user = new User; $user->name= 'thinkphp'; $user->save();
三.Loader加载类到对象
// 使用 Loader 类实例化(单例) $user = Loader::model('User');
四.使用助手函数model()
// 或者使用助手函数`model` $user = model('User'); $user->name= 'thinkphp'; $user->save();
阅读更多风口下的猪2019-06-09【thinkphp】
-
模型定义
thinkphp模型在tp5中主要是操作数据库,连接前端和数据库的处理器。
另外,模型具有唯一性,每一个模型处理一个数据表,所以在使用模型时,一定要先定义该模型操作哪个数据表,即定义要操作的数据表主键和完整数据表
namespace app\index\model; use think\Model; class User extends Model { //设置要操作数据表的主键 protected $pk = 'uid';
// 设置当前模型对应的完整数据表名称 protected $table = 'think_user'; //这里有前缀think_
}
阅读更多风口下的猪2019-06-09【thinkphp】
-
URL
thinkphp在实际开发中,url在连接或者锚点中经常使用。
URL生成使用
\think\Url::build()
方法或者使用系统提供的助手函数url()
,参数一致:Url::build('地址表达式',['参数'],['URL后缀'],['域名'])
url('地址表达式',['参数'],['URL后缀'],['域名'])
一.常用采用场景
1.本控制器内不同的方法切换
在本控制器中,使用url跳转,则直接可以使用“url(方法名)”
例如:添加栏目
以上例子是跳转到本控制器里的store方法。
2.非本控制器内的方法调用
调用其他模块控制器里的方法,则要info全部信息,即url(info,参数)
例如:栏目列表
以上例子是调用非本控制器里的admin模块下的category控制器下的index方法。
3.给url传参数(数据列表操作单个数据时常用)
3.1非pathinfo的url
在要跳转的方法后面加上一个键值对数组即可
例如:编辑栏目
这种方式生成的url是非pathinfo写法,一定要注意get参数获取时使用param代替get
3.2pathinfo的url
字符串形式加上各个参数即可
例如:location.href="{:url('del')}"+'?tag_id='+delin;
这种方式生成的url是pathinfo写法,可以直接读取get。例如get.tag_id。
阅读更多风口下的猪2019-06-09【thinkphp】
-
tp5功能模块—-修改密码
thinkphp一.概述
tp5中的修改密码,在代码上和登录功能大体相似。代码设计上,多使用session中当前值作为参考,比如:1.比较原始密码是否正确,就需要在验证数据库中的admin_id字段下是否有当前session中的admin.admin_id的基础上,比较修改密码表单中输入的原始密码和数据库中的原始密码是否正确;2.修改数据库中当前用户admin_username对应的admin_password,需要用到save([更新涉及到的字段和对应的值],[修改数据对应的主键值])方法,在取当前主键值时就使用session(admin.admin_id)作为当前主键值。
二.说明
1.在修改密码时,验证主体,可通过rule()新增验证规则内容,再使用验证场景secene()获得含有新密码(new_password)和确认密码(confirm_password)是否一致的验证规则。
也可以使用独立验证,通过Validate实例化载入验证主体,获得验证工具。
$validate = newValidate(['old_password' => 'require','new_password' => 'require','comfirm_password' => 'require|confirm:new_password'],['old_password.require'=>'请输入原始密码','new_password.require'=>'请输入新密码','comfirm_password.require'=>'请确认新密码','comfirm_password.confirm'=>'新密码确认前后不一致',]);2.仍然注意数据库中的密码是加密的,所以,表单中的post数据要加密后和数据库中的信息进行比较;
3.在修改密码成功过后,需要使用session()清楚当前session中存的原来密码相关的session,然后才能success()到重新登录的登录界面
阅读更多风口下的猪2019-06-09【thinkphp】
-
模板继承
thinkphp模板继承,主要用于基础组件和动态组件构成页面的情况。例如每个页面的菜单是固定元素,页面内容是动态元素。
其主要依靠{block}{/block}标签和{extend /}标签
这有点和discuzz中的钩子很像
1.在基础页面的动态处放“钩子”
例如:base.html中,放入content钩子
{block name="content"}{/block}
2.在子模板中继承,并完成content的内容填充
例如:index.html中
{extend name="base" /}
{block name="content"}这里是内容区域{/block}
总结:子模板继承base.html是继承其静态部分(即没有使用{block}定义的部分)。继承即是加载静态部分到自己的页面,动态部分就要自己定义。
所有主要步骤简单化是:基础模板申明动态部分,子模板继承基础模板并定义动态部分。
阅读更多风口下的猪2019-06-09【thinkphp】
-
Url访问的只能是控制器及方法
thinkphptp5中index.php作为唯一访问入口,后面跟info(模块/控制器/方法),形成访问url。也就是说不能直接访问模型(model)、视图(view)、验证器(validate)、行为(behavior)这几个文件夹下的文件以及该文件定义的方法。
也就是说程序设计时,各类、方法、模板、数组等的调用,都需要通过控制器和其下的方法来调用实现。即控制器和其下方法是所有程序的入口,是所有类及代码组件的总调官。
一.控制器调模型
(一)传统调用(本控制器名和要调用模型名称不相同时)
我身份不同,必须规范流程来。三部曲:引用、实例化、调用方法
1.引用
在模型中定义命名空间,然后在控制器中use 模型。
2.实例化
在控制器中实例化模型 :$user=new User();
3.调用方法
通过模型的实例化对象之接调用模型方法
$user->login();
当然,也可以通过类的静态方法调用
User::login();
(二)不用use调用(本控制器名和要调用的模型名称相同时)
$this->db=new \app\common\model\Category();即直接从应用根目录直接调用模块下model下的名称相同的模型。二.控制器调模板
我们是一家人,直接fetch。
控制器fetch模板时,默认是方法对应模板,即Admin::login()对应的是同模块下view/login.html。所以,要摆脱默认方法与模板对应,直接给fetch()传参,传入要跳转的同模块下view文件夹的模板文件的名称即可。例如
Admin::login('index')<==>view/index.html
三.控制器调验证器
哥们耿直,从来不用事先引用,只要有大哥(Validate)首肯说用就用
只需在需要实现验证功能的类(可控制器可模型)中,use think\Validate;
便可new Validate('User'); $validate->validate('User'); $this->validate('$data','User.edit');
$user->validate('User.edit')->save($data);
只要use think\Validate,使用验证相关方法传参我名时,默认找到我
阅读更多风口下的猪2019-06-09【thinkphp】
-
验证
thinkphptp5的验证主要用在表单验证,适合单一表单验证的项目,同样也适合定义一个大验证规则,派生多个验证表单的项目。验证主要依靠think下的Validate类。在使用验证类和定义验证器的地方一定要申明use think\Validate;
一.验证主体
验证主体由“规则内容”和“提示信息”两部分组成。一个良好的交互设计,不能没有提示信息。
1.1.规则内容
规则定义支持两种写法,即“竖线分割法”和“数组法”
(1)竖线分割法(通过|,分离字段对应的多个规则)
$rules = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
];
$validate = new Validate($rules);
(2)数组法(定义数组的形式,定义每个字段对应的多个规则)
$rules = [
'name' => ['require','max'=>25],
'age' => ['number','between'=>'1,120'],
];
$validate = new Validate($rules);
1.2.提示信息
提示信息,主要采用属性定义的方式书写
$message = [
'name.require' => '名称必须',
'name.max' => '名称最多不能超过25个字符',
'age.number' => '年龄必须是数字',
'age.between' => '年龄只能在1-120之间',
'email' => '邮箱格式错误',
];
1.3.规则内容和提示信息的分开写以及合并写
(1)分开写
$rules = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
];
$message = [
'name.require' => '名称必须',
'name.max' => '名称最多不能超过25个字符',
'age.number' => '年龄必须是数字',
'age.between' => '年龄只能在1-120之间',
'email' => '邮箱格式错误',
];
$data = [
'name' => 'thinkphp',
'age' => 121,
'email' => 'thinkphp@qq.com',
];
$validate = new Validate($rules,$msg);
$result = $validate->check($data);
if(!$result){
echo $validate->getError();
}
(2)合并写
$rule = [
['name','require|max:25','名称必须|名称最多不能超过25个字符'],
['age','number|between:1,120','年龄必须是数字|年龄必须在1~120之间'],
['email','email','邮箱格式错误']
];
$data = [
'name' => 'thinkphp',
'age' => 121,
'email' => 'thinkphp@qq.com',
];
$validate = new Validate($rules);
$result = $validate->check($data);
if(!$result){
echo $validate->getError();
}
1.4.验证规则的额外添加rule()
在定义完规则内容后,如果不想手动修改规则内容,可通过rule()方法,动态添加规则。
例如:
$rules = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
];
$validate = new Validate($rules);
$validate->rule('zip', '/^\d{6}$/');
$validate->rule([
'email' => 'email',
]);
1.5.常见的规则
tp5常见的内置规则一般都包含了很多应用场景所需要的规则定义。大致分为8类:
(1)格式验证类;(eg: require、number、integer、email、alphaDash)
(2)长度和区间验证类;(eg:in:1,2,3、between:,10、length:4、max:25、before:2016-12-11)
(3)字段比较类;(eg: confirm:password、diffrent:count、eq:100)
(4)filter验证类;(eg: filter:validate_ip)
(5)正则验证类;(eg: zip:\d{6}、regex:zip)
(6)上传验证类;(eg: file、image、fileMime)
(7)行为验证类;(eg:behavior:\app\index\behavior\check)
(8)其他验证。
详情可参看开发手册相关链接:tp5内置规则
二.验证工具的实现
验证工具,即传入参数验证数据$data即可完成验证的实例化对象。
验证工具分为两种形式:验证器+Loard::validate('验证器')和验证类实例化传入验证主体参数
2.1.Loard验证器验证工具(验证器+Loard::validate('验证器'))
其主要分为两个部分,第一部分是在项目文件夹下的validate文件夹下的验证器文件,里面定义的验证主体;第二部分是使用Loard类加载验证器并存入到实例化对象中,该对象拥有Validate类的所有方法。
- 定义验证主体的验证文件application/validate/Admin.php
php
namespace app\admin\validate;
use think\Validate;
class Admin extends Validate{
protected $rule=[
'admin_username'=>'require',
'admin_password'=>'require',
'code'=>'require|captcha'//一个字段有多个验证规则时,采用竖线隔开
];
protected $message=[
'admin_username.require'=>'请输入正确的用户名',
'admin_password.require'=>'请输入正确的密码',
'code.require'=>'请输入正确的验证码',
'code.captcha'=>'验证码不正确',
];
}
2. 完成验证工具的实现:
use think\Loader; \\引入Loard类$validate = Loader::validate('Admin'); \\使用Loader类加载validate类的代码,并且传入Admin.php验证器,将其存入到$validate对象中。
2.2.new Validate($rule)验证工具
这种方式比较传统,适合单一表单单一验证的项目,不适合一个验证主体对应多个表单的项目。
$rules = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
];
$message = [
'name.require' => '名称必须',
'name.max' => '名称最多不能超过25个字符',
'age.number' => '年龄必须是数字',
'age.between' => '年龄只能在1-120之间',
'email' => '邮箱格式错误',
];
$data = [
'name' => 'thinkphp',
'age' => 121,
'email' => 'thinkphp@qq.com',
];
$validate = new Validate($rules,$msg);
$result = $validate->check($data);
if(!$result){
echo $validate->getError();
}
三.验证场景
所谓的验证场景,指的是定义了大的验证主体,截取不同的验证规则用于不同的验证表单。
3.1定义验证场景规则(截取验证规则)
截取验证规则有两种方式:scene()函数法和$scene变量法
(1)scene()函数法
$rule=[
'name'=>'require|max:25',
'age'=>'number|between:1,120',
'email'=>'email',
];
$validate=new Validate($rule,$msg);
$validate->scene('edit',['name','age']);
(2)$scene变量法
$rule=[
'name'=>'require|max:25',
'age'=>'number|between:1,120',
'email'=>'email',
];
$scene=[
'edit'=>['name','age'];
];
3.2修改截取的规则内容
在定义场景规则时,允许对截取的内容进行修改,这不影响原来的大验证主体
$rule=[
'name'=>'require|max:25',
'age'=>'number|between:1,120',
];
$scene=[
'edit'=>['name','age'=>'require|number|between:1,120'] //为age字段增加了require规则
];
3.3获得场景对象,使用scene()函数
$validate->scene('edit');
该场景对象含有validate的绝大多数方法,比如
$validate->scene('edit')->check($data);
四.执行验证和判断返回结果
执行验证主要分为两种情况“验证工具验证”和“非验证工具验证”
这里梳理一下概念:验证工具(载入了验证主体的验证对象)验证,只需要加入验证数据$data便可执行验证,所以常常使用object->check($data);的形式执行验证。
而非验证工具验证,则是需要通过validate()等方法将验证主体(或验证场景)与验证数据加载进行比较。
4.1.验证工具验证
验证工具验证采用的是check()方法,形式是object(验证工具)->check($data);
eg:
$validate = Loader::validate('Admin');//loard验证器验证工具$validate->check($data);$validate=new Validate($rules);//验证类验证工具$validate->check($data);4.2.非验证工具验证
非验证工具验证,主要是采用validate方法,常常用在验证器验证和模型数据写入时验证。执行的对象是本类的实例化对象。例如在控制器里是$this->validate($data,$rule)。在模型中是$user=new User; $user->validate($rule)->save($data).
(1)validata()语法
validate($data(可选),$rule(可以是规则内容数组、可以是验证器、可以是验证场景))
(2)控制器验证
$result = $this->validate( [ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com', ], [ 'name' => 'require|max:25', 'email' => 'email', ]); if(true !== $result){ // 验证失败 输出错误信息 dump($result); }
调用方法的主要是$this。
(3)模型内传入数据验证
在模型中对传入数据库的数据验证,做到符合要求的数据传入到数据库中,进行了有效的把控。
A.当验证器和模型类同名时,可以采用validate(true)
$User = new User;
// 调用当前模型对应的User验证器类进行数据验证$result = $User->validate(true)->save($data);
if(false === $result){// 验证失败 输出错误信息
dump($User->getError());
}
B.当验证器和模型类不同名时,要加载该验证器,即validate('Member')
$User = new User;// 调用Member验证器类进行数据验证
$result = $User->validate('Member')->save($data);
if(false === $result){// 验证失败 输出错误信息
dump($User->getError());
}
4.3返回类型的不同
(1)在验证工具执行check(),无论验证是否通过,返回的都是布尔类型true和false。
所以$result=object->check()常常和
if(!$result)或if($result)联用
(2)在控制器中使用$this->validate(),返回的是数据类型,及提升信息。也就是说其在验证正确的情况下返回是boolean true,在验证错误情况返回string '提示错误信息'。
所以$result=$this->validate()常常和
if(true!==$result)联用
(3)在模型中验证传入数据库的信息(模型中也可以验证不用传入数据的数据,直接采用验证工具执行验证即可),使用$user->validate('User.edit')->save($data),返回的数据类型是
A.验证错误时,返回boolean false;
B.验证正确,但save()失败,返回int 0;
C.验证正确,save()成功,返回int 1。
所以$result=$user->validate('User.edit')->save($data)常常和
if(false===$result)联用
五.打印或输出提示信息
输出错误信息,常常用object->getError()方法,但这只能返回错误信息。正确的提示信息,不能提示。
建议对返回结果进行判断,然后返回一个布尔类型和其对应的提示信息(无论错误还是失败)
例如:
if(!$result){
return ['void'=>0,'msg'=>'验证失败'];
}
else{
return ['void'=>1,'msg'=>'验证成功'];
}
六.静态调用
如果需要使用内置的规则验证单个数据,可以使用静态调用的方式。
// 日期格式验证 Validate::dateFormat('2016-03-09','Y-m-d'); // true // 验证是否有效的日期 Validate::is('2016-06-03','date'); // true // 验证是否有效邮箱地址 Validate::is('thinkphp@qq.com','email'); // true // 验证是否在某个范围 Validate::in('a',['a','b','c']); // true // 验证是否大于某个值 Validate::gt(10,8); // true // 正则验证 Validate::regex(100,'\d+'); // true
阅读更多风口下的猪2019-06-09【thinkphp】
-
tp5功能模块—登录功能
thinkphp一.模块概述
登录功能,主要通过1.session和重定向、2.表单验证、3.验证码、4.加密、5.数据表用户密码比对、6.模型Admin在执行“验证表单、对比用户和密码、存入正确信息到session”三部曲中返回不同结果值和结果对应提示文本,被控制器login捕获,Login对不同的结果值判断,执行success()和error返回到不同的页面。这六个版块。二.说明:
- 登录功能中使用的加密,是依赖后盾网的加密开源库。将其加载到thinkphp5框架的方法是:cmd cd 到thinkphp项目(也就是有json和composer.lock的文件夹中),执行composer require houdunwang\Crypt;便可荡下后盾网的第三方加密库。
- 使用加密功能时,要在congfig文件中配置密匙。详情查看后盾网扩展库
//后盾网加密key
'crypt' =>[
'key' => '405305c793179059f8fd52436876750c587d19ccfbbe2a643743d021dbdcd79c',
], - 数据库中的用户密码存入的是加密后的字符串,并不是明显的字符串。
阅读更多风口下的猪2019-06-09【thinkphp】
-
重定向redirect()
thinkphp重定向会改变当前URL并一直指向另一个URL
例如:
1.重定向到某一个操作
//重定向到News模块的Category操作 $this->redirect('News/category', ['cate_id' => 2]);
2.或者直接重定向到一个指定的外部URL地址
//重定向到指定的URL地址 并且使用302 $this->redirect('http://thinkphp.cn/blog/2',302);
3.可以在重定向的时候通过session闪存数据传值
$this->redirect('News/category', ['cate_id' => 2], 302, ['data' => 'hello']);
阅读更多风口下的猪2019-06-09【thinkphp】
-
页面跳转success()和error()
thinkphp系统的
\think\Controller
类内置了两个跳转方法success
和error
,用于页面跳转提示。一.语法
语法success($msg,$url)和error($msg,$url)。
参数中string是提示信息,url是成功或者失败时跳转的页面或网址。
url地址是可选的,success方法的默认跳转地址是
$_SERVER["HTTP_REFERER"]
,error方法的默认跳转地址是javascript:history.back(-1);
。二.暂时转移默认模板
success
和error
方法都可以对应的模板,默认的设置是两个方法对应的模板都是tpl下的dispatch_jump.tplcofig.php中配置信息如下:
'dispatch_success_tmpl' => THINK_PATH .'tpl'. DS .'dispatch_jump.tpl',
'dispatch_success_tmpl' => THINK_PATH .'tpl'. DS .'dispatch_jump.tpl',
dispatch_jump.tpl的模板内容中含有以下几个模板变量:
$data 要返回的数据
$msg 页面提示信息
$code 返回的code
$wait 跳转等待时间 单位为秒
$url 跳转页面地址
dispatch_jump.tpl的模板内容如下:
三.修改暂时转移模板
(1)通过修改config.php的配置,定义success和error暂时转移的模板
例如:
// 默认跳转页面对应的模板文件
'dispatch_success_tmpl' => APP_PATH . 'index' . DS . 'view/index/error.html',
'dispatch_error_tmpl' => APP_PATH . 'index' . DS . 'view/index/ok.html',(2)通过修改默认暂时转移页面样式和内容
(function(){
var wait = document.getElementById('wait'),
href = document.getElementById('href').href;
var interval = setInterval(function(){
var time = --wait.innerHTML;
if(time <= 0) {
location.href = href;
clearInterval(interval);
};
}, 1000);
})();
注意原模板中的js控制跳转时间和跳转url的方法,以及echo出来的php中switch对不同$code返回不同$msg的方法。
阅读更多风口下的猪2019-06-09【thinkphp】
-
加载验证器$validate = Loader::validate(‘验证器名称’)的理解
thinkphpLoader是直接加载一个类的代码,这里是加载validate类,并传入参数使validate的代码整体完整。最后存放于$validate这个实例内存中。所以在后面不用再实例化,且$validate能使用所有validate类的方法。因为$validate内存中已经存放所有代码。
实例化,其实是有规则地拷贝。
阅读更多风口下的猪2019-06-09【thinkphp】