成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

firim / 2092人閱讀

摘要:密碼加密時遇到的問題今天遇到密碼加密的問題,當(dāng)時使用的是模型數(shù)據(jù)完成實現(xiàn)的自動進行加密,但是在上面模型修改器中發(fā)現(xiàn)修改器和數(shù)據(jù)完成功能一樣,看下方的評論說是數(shù)據(jù)完成和修改器配合使用,我就照著做,當(dāng)時這樣寫的模型層包含新增和更新操作,

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

class User extends Model{
//$auto包含新增$insert和更新操作$update,就是不管新增還是更新我就自動執(zhí)行
    protected $auto = ["password","create"];
    public function setPasswordAttr($value)
    {
        return md5($value);
    }
    public function setCreateAttr()
    {
        return time();
    }
    
//注冊用戶
    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.");
//注冊
            $res = $userModel->register($data);
           echo $res;
        }else{
            $this->error("非法訪問");
        }
    }

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

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

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

//新建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();
    }
多帶帶測試修改器
首先注釋掉模型層中的 “數(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)用時傳遞過來的值
        dump(md5($value));//把該值加密
        return md5($value);//把該值加密返回

    }
    public function addPass(){
        echo "修改器:修改器的作用是可以在數(shù)據(jù)賦值的時候自動進行轉(zhuǎn)換處理";
        $this->password="wwwwww";
        dump($this->password);//輸出返回后的結(jié)果

//        echo "數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時進行處理";
//        $this->save([
//            "username"  => "thinkphp",
//            "password"  => "wwwwww",
//            "create"    => "123456"
//        ]);
    }
}
執(zhí)行后頁面顯示結(jié)果,通過結(jié)果發(fā)現(xiàn)修改器是在賦值的時候執(zhí)行的自動加密,注意:此時并沒有存入數(shù)據(jù)庫!
修改器:修改器的作用是可以在數(shù)據(jù)賦值的時候自動進行轉(zhuǎn)換處理

string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密的NULL】

string(6) "wwwwww"【傳過來的$value】

string(32) "d785c99d298a4e9e6e13fe99e602ef42"【加密$value】

string(32) "d785c99d298a4e9e6e13fe99e602ef42"【return返回的結(jié)果】
測試數(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)用時傳遞過來的值
        dump(md5($value));//把該值加密
        return md5($value);//把該值加密返回

    }
    public function addPass(){
//        echo "修改器:修改器的作用是可以在數(shù)據(jù)賦值的時候自動進行轉(zhuǎn)換處理";
//        $this->password="wwwwww";
//        dump($this->password);//輸出返回后的結(jié)果

        echo "數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時進行處理";
        $this->save([
            "username"  => "thinkphp",
            "password"  => "wwwwww",
            "create"    => "123456"
        ]);
    }
}
找到原因
執(zhí)行后發(fā)現(xiàn)setPasswordAttr()被執(zhí)行了兩次,所以password也被加密了兩次;
數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時進行處理

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"】
加密兩次的原因是在賦值的時候加密一次,自動完成$auto時加密了一次
[
    "username"  => "thinkphp",
    "password"  => "wwwwww",
    "create"    => "123456"
]
解決開始的問題
如果想要加密一次就把 protected $auto = ["password"]; 注釋掉,或者在登陸的代碼中進行md5(md5("wwwwww")),注釋掉后執(zhí)行:
數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時進行處理

string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】

string(6) "wwwwww"【$value】

string(32) "d785c99d298a4e9e6e13fe99e602ef42"【加密結(jié)果】

如果是多個字段protected $auto = ["password","create"];就把password去掉就可以了protected $auto = ["create"];,所以最開始的問題就解決了。
當(dāng)只有數(shù)據(jù)完成但不賦值
在上面可能注意到我怎么老是加密 NULL 干什么,還有另一種情況就是 protected $auto = ["password"]; 定義了自動完成,但是我并沒有賦值:
namespace appindexModel;
use thinkModel;
class Test extends Model
{
    protected $auto = ["password"];
    protected function setPasswordAttr($value)
    {
        dump(md5(NULL));//把NULL加密
        dump($value);   //查看調(diào)用時傳遞過來的值
        dump(md5($value));//把該值加密
        return md5($value);//把該值加密返回

    }
    public function addPass(){
//        echo "修改器:修改器的作用是可以在數(shù)據(jù)賦值的時候自動進行轉(zhuǎn)換處理";
//        $this->password="wwwwww";
//        dump($this->password);//輸出返回后的結(jié)果

        echo "數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時進行處理";
        $this->save([
            "username"  => "thinkphp",
//注釋掉,不賦值
 //           "password"  => "wwwwww",
            "create"    => "123456"
        ]);
    }
}
執(zhí)行后,加密的是 NULL
數(shù)據(jù)完成:在數(shù)據(jù)字段insert,update,auto時進行處理

string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】

NULL【沒有傳值,$value=NULL】

string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密$value,剛好等于NULL加密結(jié)果】

剩下的$update和$insert使用方法同$auto一樣,$auto包含$update和$insert
總結(jié)
修改器會在賦值時執(zhí)行;數(shù)據(jù)完成會被執(zhí)行兩次,一次是賦值時,一次是寫入數(shù)據(jù)時
希望手冊能稍微詳細一點點,白白耽誤我開發(fā)時間,特此分享,大家少踩坑,如果理解的不對請指正,謝謝

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/23170.html

相關(guān)文章

  • TP-admin即基于ThinkPHP5拿來即用高性能后臺管理系統(tǒng)

    摘要:即基于拿來即用高性能后臺管理系統(tǒng)官方文檔地址在線體驗地址賬戶密碼線上倉庫在線地址源代碼下載克隆直接下載本地部署運行環(huán)境要求建議配置虛擬域名若不清楚,請自行解決之,方便接下來開展你的開發(fā)工作。 新版本在線體驗地址已經(jīng)上線,歡迎體驗? ---2017-01-14 喜歡就Star,不只是Fork; 想要分享的動機才是驅(qū)動力,而技術(shù)僅僅是一種方法。 ====================...

    Hydrogen 評論0 收藏0
  • TP-admin即基于ThinkPHP5拿來即用高性能后臺管理系統(tǒng)

    摘要:即基于拿來即用高性能后臺管理系統(tǒng)官方文檔地址在線體驗地址賬戶密碼線上倉庫在線地址源代碼下載克隆直接下載本地部署運行環(huán)境要求建議配置虛擬域名若不清楚,請自行解決之,方便接下來開展你的開發(fā)工作。 新版本在線體驗地址已經(jīng)上線,歡迎體驗? ---2017-01-14 喜歡就Star,不只是Fork; 想要分享的動機才是驅(qū)動力,而技術(shù)僅僅是一種方法。 ====================...

    Aklman 評論0 收藏0
  • 基于ThinkPHP5拿來即用高性能后臺管理系統(tǒng)

    摘要:數(shù)據(jù)庫文件已經(jīng)上傳,安裝配置就可以使用簡稱即基于的后臺管理系統(tǒng)官方文檔地址在線體驗地址賬戶密碼線上倉庫在線地址源代碼下載克隆直接下載本地部署運行環(huán)境要求建議配置虛擬域名若不清楚,請自行解決之,方便接下來開展你的開發(fā)工作。 喜歡就Star,不只是Fork; 想要分享的動機才是驅(qū)動力,而技術(shù)僅僅是一種方法。 數(shù)據(jù)庫文件已經(jīng)上傳,安裝配置就可以使用 showImg(https://seg...

    894974231 評論0 收藏0
  • 基于ThinkPHP5拿來即用高性能后臺管理系統(tǒng)

    摘要:數(shù)據(jù)庫文件已經(jīng)上傳,安裝配置就可以使用簡稱即基于的后臺管理系統(tǒng)官方文檔地址在線體驗地址賬戶密碼線上倉庫在線地址源代碼下載克隆直接下載本地部署運行環(huán)境要求建議配置虛擬域名若不清楚,請自行解決之,方便接下來開展你的開發(fā)工作。 喜歡就Star,不只是Fork; 想要分享的動機才是驅(qū)動力,而技術(shù)僅僅是一種方法。 數(shù)據(jù)庫文件已經(jīng)上傳,安裝配置就可以使用 showImg(https://seg...

    SHERlocked93 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<