ホームページ >PHPフレームワーク >ThinkPHP >thinkphp5.0モディファイアとデータ補完の関係と使い方を紹介

thinkphp5.0モディファイアとデータ補完の関係と使い方を紹介

藏色散人
藏色散人転載
2021-04-27 16:39:241794ブラウズ

thinkphp の次のチュートリアル コラムでは、thinkphp5.0 モディファイアとデータ補完の関係とその使用方法を紹介します。必要!

thinkphp5.0 修飾子とデータ補完の関係とその使用方法

パスワード暗号化時に発生した問題

今日、パスワード md5 暗号化の問題に遭遇しました。 , その際は「thinkphp5.0.9->Model->Data Completion」を使って自動暗号化を実装していましたが、上記の「thinkphp5.0.9->Model->Modifier」では修飾子がにはデータ補完と同じ機能があります。データ補完や修飾子と組み合わせて使用​​されるという以下のコメントを読んで、それに従って次のように書きました。
//模型层

class User extends Model{
//$auto包含新增$insert和更新操作$update,就是不管新增还是更新我就自动执行
    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 \app\index\Model\User();
            $data=input('post.');
//注册
            $res = $userModel->register($data);
           echo $res;
        }else{
            $this->error('非法访问');
        }
    }

thinkphp5.0モディファイアとデータ補完の関係と使い方を紹介

上記に従い「wwwwww」と入力しました コード登録後、パスワード暗号化結果は b8d3c8f4db0c248ac242dd6e098bbf85
正しい暗号化結果は d785c99d298a4e9e6e13fe99e602ef42 です この時点では気づかないかもしれませんが、ログインするとログインできなくなります。新しいユーザーを登録する必要があります。たとえば、パスワードは wwwwww のままです。ログインしてもログインできません。暗号化エラーがあることを疑うしかありません。その後、データが完了した「setPasswordAttr()」が見つかります。 「

別に取り出してテストしてください

答えだけ教えてください、修飾子とデータを何度も見て、2時間かけてテストを完了して、ようやくわかりました」新しいテスト テーブル

thinkphp5.0モディファイアとデータ補完の関係と使い方を紹介

//新建test模型层
namespace app\index\Model;
use think\Model;
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 "数据完成";
        $this->save([
            'username'  => 'thinkphp',
            'password'  => 'wwwwww',
            'create'    => '123456'
        ]);
    }
}

//控制器中添加test方法
 public function test(){
        $user = model('Test');
        //调用model层函数
        $user->addPass();
    }
修飾子のみをテストしました

最初にモデル レイヤーの「データ補完」部分をコメント アウトしました
namespace app\index\Model;
use think\Model;
class Test extends Model
{
    protected $auto = ['password'];
    protected function setPasswordAttr($value)
    {
        dump(md5(NULL));//把NULL加密
        dump($value);   //查看调用时传递过来的值
        dump(md5($value));//把该值加密
        return md5($value);//把该值加密返回

    }
    public function addPass(){
        echo "修改器:修改器的作用是可以在数据赋值的时候自动进行转换处理";
        $this->password='wwwwww';
        dump($this->password);//输出返回后的结果

//        echo "数据完成:在数据字段insert,update,auto时进行处理";
//        $this->save([
//            'username'  => 'thinkphp',
//            'password'  => 'wwwwww',
//            'create'    => '123456'
//        ]);
    }
}
実行後、ページに結果が表示されます。結果から、値を割り当てるときに修飾子が自動的に暗号化されることがわかります。注: 現時点では保存されません。データベース!
修改器:修改器的作用是可以在数据赋值的时候自动进行转换处理

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

string(6) "wwwwww"【传过来的$value】

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

string(32) "d785c99d298a4e9e6e13fe99e602ef42"【return返回的结果】
データ補完をテスト

「修飾子」部分のコードをコメントアウトし、データ補完のみを実行
namespace app\index\Model;
use think\Model;
class Test extends Model
{
    protected $auto = ['password'];
    protected function setPasswordAttr($value)
    {
        dump(md5(NULL));//把NULL加密
        dump($value);   //查看调用时传递过来的值
        dump(md5($value));//把该值加密
        return md5($value);//把该值加密返回

    }
    public function addPass(){
//        echo "修改器:修改器的作用是可以在数据赋值的时候自动进行转换处理";
//        $this->password='wwwwww';
//        dump($this->password);//输出返回后的结果

        echo "数据完成:在数据字段insert,update,auto时进行处理";
        $this->save([
            'username'  => 'thinkphp',
            'password'  => 'wwwwww',
            'create'    => '123456'
        ]);
    }
}
理由を見つける

実行後setPasswordAttr() は 2 回実行されるため、パスワードも 2 回暗号化されます;
数据完成:在数据字段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"】
2 回暗号化される理由は、値を割り当てるときに 1 回、$auto が自動的に完了するときに 1 回暗号化されるためです。
[
    'username'  => 'thinkphp',
    'password'  => 'wwwwww',
    'create'    => '123456'
]
最初の問題の解決
##一度暗号化したい場合は、 protected $auto = ['password']; をコメントアウトするか、ログインコードで md5(md5("wwwwww")) を実行し、コメントアウト 実行後:

数据完成:在数据字段insert,update,auto时进行处理

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

string(6) "wwwwww"【$value】

string(32) "d785c99d298a4e9e6e13fe99e602ef42"【加密结果】

複数のフィールドがある場合 protected $auto = ['password','create']; パスワードを削除するだけ protected $auto = [ ' create']; したがって、元の問題は解決されます。 thinkphp5.0モディファイアとデータ補完の関係と使い方を紹介

データだけが完成し、値が割り当てられていない場合
上で私が常に NULL を暗号化する方法に気づいたかもしれませんが、protected $auto = ['password']; 定義が行われる別の状況もあります。自動的に完了しましたが、値を割り当てませんでした:

namespace app\index\Model;
use think\Model;
class Test extends Model
{
    protected $auto = ['password'];
    protected function setPasswordAttr($value)
    {
        dump(md5(NULL));//把NULL加密
        dump($value);   //查看调用时传递过来的值
        dump(md5($value));//把该值加密
        return md5($value);//把该值加密返回

    }
    public function addPass(){
//        echo "修改器:修改器的作用是可以在数据赋值的时候自动进行转换处理";
//        $this->password='wwwwww';
//        dump($this->password);//输出返回后的结果

        echo "数据完成:在数据字段insert,update,auto时进行处理";
        $this->save([
            'username'  => 'thinkphp',
//注释掉,不赋值
 //           'password'  => 'wwwwww',
            'create'    => '123456'
        ]);
    }
}

実行後の暗号化は NULL
数据完成:在数据字段insert,update,auto时进行处理

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

NULL【没有传值,$value=NULL】

string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密$value,刚好等于NULL加密结果】

残りの $update および $insert の使用方法$auto と同様、$auto には $update と $insert が含まれますthinkphp5.0モディファイアとデータ補完の関係と使い方を紹介

概要
修飾子は代入時に実行されます。データ補完は代入時に 1 回、書き込み時に 1 回の計 2 回実行されます。データ入力時に

開発時間が無駄になるので、マニュアルがもう少し詳しくなるといいのですが、誰もが落とし穴を避けることができるように、これを共有したいと思います。何か間違っていることがあれば修正してください。ありがとうございます

以上がthinkphp5.0モディファイアとデータ補完の関係と使い方を紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。