当前位置: 首页 > 后端技术 > PHP

thinkphp5.0修饰符与数据补全的关系及使用方法

时间:2023-03-29 16:37:35 PHP

密码加密遇到的问题今天遇到密码md5加密的问题。当时我是用“thinkphp5.0.9->model->datacompletion”来实现自动加密的,但是在上面“thinkphp5.0.9->model->Modifier”里面,发现modifier和数据补全,下面评论说数据补全和修饰符一起用,所以照着做了,当时是这样写的://ModellayerclassUserextendsModel{//$autoincludesnew$insert以及更新操作$update,即无论是新建还是更新,我都会自动执行protected$auto=['password','create'];publicfunctionsetPasswordAttr($value){returnmd5($value);}publicfunctionsetCreateAttr(){returntime();}//注册用户publicfunctionregister($data){$bool=$this->save($data);return$bool?$this->id:0;}}//控制器层方法publicfunctionregister(){if(request()->isAjax()){$userModel=new\app\index\Model\User();$data=input('post.');//注册$res=$userModel->register($data);echo$res;}else{$this->error('非法访问');我输入“wwwwww”,按照上面的代码注册后,密码加密结果为b8d3c8f4db0c248ac242dd6e098bbf85,正确的加密结果为d785c99d298a4e9e6e13fe99e602ef42,这个时候你可能没有注意到。登录的时候不能登录,必须注册一个新用户。比如密码还是wwwwww。登陆的时候还是登陆不上,只能怀疑加密有误,然后去网上找了下“数据完成setPasswordAttr()”拿出来测试。让我直接告诉你答案。看了修改器和数据两个小时才完成测试,终于知道原因了。新建测试表//新建测试模型层命名空间app\index\Model;usethink\Model;classTestextendsModel{protected$auto=['password'];受保护的函数setPasswordAttr($value){dump(md5(NULL));转储($值);转储(md5($值));返回md5($值);}publicfunctionaddPass(){echo"修改器";$this->password='wwwwww';转储($this->密码);echo"数据完成";$this->save(['用户名'=>'thinkphp','密码'=>'wwwwww','create'=>'123456']);}}//给控制器添加测试方法publicfunctiontest(){$user=model('Test');//调用模型层函数$user->addPass();}单独的测试修饰符先注释掉模型层的“数据补全”部分命名空间app\index\Model;usethink\Model;classTestextendsModel{protected$auto=['密码'];protectedfunctionsetPasswordAttr($value){dump(md5(NULL));//加密NULLdump($value);//检查调用dump时传递的值(md5($value));//加密值re??turnmd5($value);//加密值并返回}publicfunctionaddPass(){echo"修饰符:函数修饰符是自动赋值数据进行转换处理”;$this->password='wwwwww';dump($this->password);//输出返回结果//echo"Datacompletion:processwhenthedatafieldisinsert,update,auto";//$this->save([//'username'=>'thinkphp',//'密码'=>'wwwwww',//'创建'=>'123456'//]);}}执行结果显示在最后一页。通过结果发现修饰符在赋值的时候自动加密了。注意:此时还没有存入数据库!修饰符:修饰符的作用是在数据赋值时自动进行转换处理string(32)"d41d8cd98f00b204e9800998ecf8427e"[encryptedNULL]string(6)"wwwwww"[passed$value]string(32)"d785c99d298a4e9e6e13fe99e602ef42"【Encrypted$value】string(32)"d785c99d298a4e9e6e13fe99e602ef42"【返回结果】测试数据完成,注释掉“Modifier”部分的代码,只执行数据完成namespaceapp\index\Model;usethink\Model;类测试extends模型{protected$auto=['password'];protectedfunctionsetPasswordAttr($value){dump(md5(NULL));//加密NULLdump($value);//检查调用时传递的值转储(md5($value));//加密值re??turnmd5($value);//加密值并返回}publicfunctionaddPass(){//echo"Modifier:The修饰符的作用是传递数据赋值时自动转换处理";//$this->password='wwwwww';//dump($this->password);//输出返回结果echo"数据完成:插入,更新数据字段,自动处理";$this->save(['用户名'=>'thinkphp','密码'=>'wwwwww','create'=>'123456']);}}执行后发现原因setPasswordAttr()执行了两次,所以密码也加密了两次;数据补全:数据域处理insert,update,autostring(32)"d41d8cd98f00b204e9800998ecf8427e"[encryptedNULL]string(6)"wwwwww"【传入$value】string(32)"d785c99d298a4e9e6e13fe99e602ef42"【Encrypted$value="wwwwww"】string(32)"d41d8cd98f00b204e9800998ecf8427e"【加密NULL】string(32)"d785c99d298a4e9e6value2e602ef932)"b8d3c8f4db0c248ac242dd6e098bbf85"【再次加密$value="d785c99...f42"】加密两次的原因是赋值时加密一次,$auto自动完成时加密一次['username'=>'thinkphp','password'=>'wwwwww','create'=>'123456']解决初始问题如果要加密一次,注释掉protected$auto=['password'];或执行md5(md5("wwwwww")),注释掉后执行:数据补全:处理数据字段insert,update,auto32)"d785c99d298a4e9e6e13fe99e602ef42"[加密结果]如果有多个字段protected$auto=['密码','创建'];只需删除protected$auto=['create'];的密码,这样最初的问题就解决了。当只完成数据而没有赋值时,你可能会注意到我总是加密NULL。另一种情况是protected$auto=['password'];定义了自动完成,但我没有分配:namespaceapp\index\Model;usethink\Model;classTestextendsModel{protected$auto=['password'];protectedfunctionsetPasswordAttr($value){dump(md5(NULL));//加密NULLdump($value);//校验值dump(md5($value));//加密值returnmd5($value);//加密值并返回}publicfunctionaddPass(){//echo"修饰符:修饰符的作用是在数据赋值时自动进行转换处理";//$this->password='wwwwww';//dump($this->password);//输出返回结果echo"Datacompleted:processindatafieldinsert,update,auto";$this->save(['username'=>'thinkphp',//注释掉,不赋值//'password'=>'wwwwww','create'=>'123456']);}}执行后,加密数据为NULL完成:在数据字段处理insert,update,autostring(32)"d41d8cd98f00b204e9800998ecf8427e"【加密NULL】NULL【没有传值,$value=NULL】string(32)"d41d8cd98f00b204e9800998ecf8427e"【加密$值,刚好等于NULL加密结果】$update和$insert的其余部分使用方法与$auto相同,$auto包含$update和$insert。summary修饰符会在赋值的时候执行;datacompletion会执行两次,一次是赋值的时候,一次是写数据的时候。希望手册能详细一点,浪费我的开发时间。分享到这里,大家不要踩坑,理解有误请指正,谢谢