站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        介紹thinkphp5.0修改器和數(shù)據(jù)完成的關(guān)系及使用方法

        下面由thinkphp教程欄目給大家介紹thinkphp5.0修改器和數(shù)據(jù)完成的關(guān)系及使用方法,希望對(duì)需要的朋友有所幫助!

        thinkphp5.0修改器和數(shù)據(jù)完成的關(guān)系以及使用方法

        密碼加密時(shí)遇到的問題

        今天遇到密碼md5加密的問題,當(dāng)時(shí)使用的是 "thinkphp5.0.9->模型->數(shù)據(jù)完成" 實(shí)現(xiàn)的自動(dòng)進(jìn)行加密,但是在上面 "thinkphp5.0.9->模型->修改器" 中發(fā)現(xiàn)修改器和數(shù)據(jù)完成功能一樣,看下方的評(píng)論說是數(shù)據(jù)完成和修改器配合使用,我就照著做,當(dāng)時(shí)這樣寫的:

        //模型層  class User extends Model{ //$auto包含新增$insert和更新操作$update,就是不管新增還是更新我就自動(dòng)執(zhí)行     protected $auto = ['password','create'];     public function setPasswordAttr($value)     {         return md5($value);     }     public function setCreateAttr()     {         return time();     }      //注冊(cè)用戶     public function register($data){             $bool = $this->save($data);             return $bool ? $this->id : 0;     }  }  //控制器層方法 public function register()     {         if(request()->isAjax()){             $userModel=new appindexModelUser();             $data=input('post.'); //注冊(cè)             $res = $userModel->register($data);            echo $res;         }else{             $this->error('非法訪問');         }     }

        介紹thinkphp5.0修改器和數(shù)據(jù)完成的關(guān)系及使用方法

        我輸入 "wwwwww" 按照上面的代碼進(jìn)行注冊(cè)后password加密結(jié)果是b8d3c8f4db0c248ac242dd6e098bbf85

        正確的加密結(jié)果是 d785c99d298a4e9e6e13fe99e602ef42,這個(gè)時(shí)候你可能沒發(fā)現(xiàn),當(dāng)你登陸的時(shí)候就是登陸不上去,你肯定再去注冊(cè)一個(gè)新用戶,比如密碼還是wwwwww,你登陸的時(shí)候還是登陸不上去,只能懷疑加密出錯(cuò),再往上找到了 "數(shù)據(jù)完成的setPasswordAttr()"

        單獨(dú)拿出來測(cè)試

        直接說答案吧,我當(dāng)時(shí)看了多遍修改器和數(shù)據(jù)完成測(cè)試兩個(gè)小時(shí)終于知道原因了,新建的test表

        介紹thinkphp5.0修改器和數(shù)據(jù)完成的關(guān)系及使用方法

        //新建test模型層 namespace appindexModel; use thinkModel; class Test extends Model {     protected $auto = ['password'];     protected function setPasswordAttr($value)     {         dump(md5(NULL));         dump($value);         dump(md5($value));         return md5($value);      }     public function addPass(){         echo "修改器";         $this->password='wwwwww';         dump($this->password);                  echo "數(shù)據(jù)完成";         $this->save([             'username'  => 'thinkphp',             'password'  => 'wwwwww',             'create'    => '123456'         ]);     } }  //控制器中添加test方法  public function test(){         $user = model('Test');         //調(diào)用model層函數(shù)         $user->addPass();     }

        單獨(dú)測(cè)試修改器

        首先注釋掉模型層中的 “數(shù)據(jù)完成” 部分

        namespace appindexModel; use thinkModel; class Test extends Model {     protected $auto = ['password'];     protected function setPasswordAttr($value)     {         dump(md5(NULL));//把NULL加密         dump($value);   //查看調(diào)用時(shí)傳遞過來的值         dump(md5($value));//把該值加密         return md5($value);//把該值加密返回      }     public function addPass(){         echo "修改器:修改器的作用是可以在數(shù)據(jù)賦值的時(shí)候自動(dòng)進(jìn)行轉(zhuǎn)換處理";         $this->password='wwwwww';         dump($this->password);//輸出返回后的結(jié)果  //        echo "數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時(shí)進(jìn)行處理"; //        $this->save([ //            'username'  => 'thinkphp', //            'password'  => 'wwwwww', //            'create'    => '123456' //        ]);     } }

        執(zhí)行后頁(yè)面顯示結(jié)果,通過結(jié)果發(fā)現(xiàn)修改器是在賦值的時(shí)候執(zhí)行的自動(dòng)加密,注意:此時(shí)并沒有存入數(shù)據(jù)庫(kù)!

        修改器:修改器的作用是可以在數(shù)據(jù)賦值的時(shí)候自動(dòng)進(jìn)行轉(zhuǎn)換處理  string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密的NULL】  string(6) "wwwwww"【傳過來的$value】  string(32) "d785c99d298a4e9e6e13fe99e602ef42"【加密$value】  string(32) "d785c99d298a4e9e6e13fe99e602ef42"【return返回的結(jié)果】

        測(cè)試數(shù)據(jù)完成

        注釋掉“修改器”部分的代碼,僅執(zhí)行數(shù)據(jù)完成

        namespace appindexModel; use thinkModel; class Test extends Model {     protected $auto = ['password'];     protected function setPasswordAttr($value)     {         dump(md5(NULL));//把NULL加密         dump($value);   //查看調(diào)用時(shí)傳遞過來的值         dump(md5($value));//把該值加密         return md5($value);//把該值加密返回      }     public function addPass(){ //        echo "修改器:修改器的作用是可以在數(shù)據(jù)賦值的時(shí)候自動(dòng)進(jìn)行轉(zhuǎn)換處理"; //        $this->password='wwwwww'; //        dump($this->password);//輸出返回后的結(jié)果          echo "數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時(shí)進(jìn)行處理";         $this->save([             'username'  => 'thinkphp',             'password'  => 'wwwwww',             'create'    => '123456'         ]);     } }

        找到原因

        執(zhí)行后發(fā)現(xiàn)setPasswordAttr()被執(zhí)行了兩次,所以password也被加密了兩次;

        數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時(shí)進(jìn)行處理  string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】  string(6) "wwwwww"【傳入的$value】  string(32) "d785c99d298a4e9e6e13fe99e602ef42"【加密$value="wwwwww"】  string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】  string(32) "d785c99d298a4e9e6e13fe99e602ef42"【傳入的$value】  string(32) "b8d3c8f4db0c248ac242dd6e098bbf85"【再次加密$value="d785c99...f42"】

        加密兩次的原因是在賦值的時(shí)候加密一次,自動(dòng)完成$auto時(shí)加密了一次

        [     'username'  => 'thinkphp',     'password'  => 'wwwwww',     'create'    => '123456' ]

        解決開始的問題

        如果想要加密一次就把 protected $auto = ['password']; 注釋掉,或者在登陸的代碼中進(jìn)行md5(md5("wwwwww")),注釋掉后執(zhí)行:

        數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時(shí)進(jìn)行處理  string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】  string(6) "wwwwww"【$value】  string(32) "d785c99d298a4e9e6e13fe99e602ef42"【加密結(jié)果】

        介紹thinkphp5.0修改器和數(shù)據(jù)完成的關(guān)系及使用方法

        如果是多個(gè)字段protected $auto = ['password','create'];就把password去掉就可以了protected $auto = ['create'];,所以最開始的問題就解決了。

        當(dāng)只有數(shù)據(jù)完成但不賦值

        在上面可能注意到我怎么老是加密 NULL 干什么,還有另一種情況就是 protected $auto = ['password']; 定義了自動(dòng)完成,但是我并沒有賦值:

        namespace appindexModel; use thinkModel; class Test extends Model {     protected $auto = ['password'];     protected function setPasswordAttr($value)     {         dump(md5(NULL));//把NULL加密         dump($value);   //查看調(diào)用時(shí)傳遞過來的值         dump(md5($value));//把該值加密         return md5($value);//把該值加密返回      }     public function addPass(){ //        echo "修改器:修改器的作用是可以在數(shù)據(jù)賦值的時(shí)候自動(dòng)進(jìn)行轉(zhuǎn)換處理"; //        $this->password='wwwwww'; //        dump($this->password);//輸出返回后的結(jié)果          echo "數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時(shí)進(jìn)行處理";         $this->save([             'username'  => 'thinkphp', //注釋掉,不賦值  //           'password'  => 'wwwwww',             'create'    => '123456'         ]);     } }

        執(zhí)行后,加密的是 NULL

        數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時(shí)進(jìn)行處理  string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】  NULL【沒有傳值,$value=NULL】  string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密$value,剛好等于NULL加密結(jié)果】

        介紹thinkphp5.0修改器和數(shù)據(jù)完成的關(guān)系及使用方法

        剩下的$update和$insert使用方法同$auto一樣,$auto包含$update和$insert

        總結(jié)

        修改器會(huì)在賦值時(shí)執(zhí)行;數(shù)據(jù)完成會(huì)被執(zhí)行兩次,一次是賦值時(shí),一次是寫入數(shù)據(jù)時(shí)

        希望手冊(cè)能稍微詳細(xì)一點(diǎn)點(diǎn),白白耽誤我開發(fā)時(shí)間,特此分享,大家少踩坑,如果理解的不對(duì)請(qǐng)指正,謝謝

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 国产福利电影一区二区三区久久久久成人精品综合| 国产精品99久久久久久人| 国产午夜精品理论片久久影视 | 黑人巨大精品欧美一区二区| 国产高清在线精品一区二区| 91麻精品国产91久久久久| 91无码人妻精品一区二区三区L| 国产精品人人做人人爽| 久久国产成人亚洲精品影院| 97精品国产高清自在线看超| 99久久国产综合精品五月天喷水 | 99久久久精品| 国产成人无码精品一区在线观看| 国产精品无码久久综合网| 久久久久国产精品三级网| 亚洲AV日韩精品久久久久久| jizz国产精品网站| 国产精品亚洲综合专区片高清久久久 | 亚洲高清国产拍精品青青草原| 国内揄拍高清国内精品对白| 香蕉国产精品频视| 在线精品无码字幕无码AV| 日韩麻豆国产精品欧美| 久久精品国产亚洲精品| …久久精品99久久香蕉国产| 欧美精品亚洲精品日韩| 亚洲乱码日产精品a级毛片久久| 精品亚洲永久免费精品| 久久丫精品国产亚洲av不卡| 久久免费精品一区二区| 亚洲国产精品久久久天堂| 99热精品久久只有精品| 2020国产精品| 精品无码人妻一区二区三区品| 精品欧美激情在线看| 2021国产三级精品三级在专区| 亚洲日韩精品A∨片无码| 国产色婷婷精品综合在线| 国产精品自拍一区| 国产成人精品高清在线观看99| 亚洲一区二区三区在线观看精品中文 |