上記に従い「wwwwww」と入力しました コード登録後、パスワード暗号化結果は b8d3c8f4db0c248ac242dd6e098bbf85//模型层 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('非法访问'); } }ログイン後にコピー
正しい暗号化結果は d785c99d298a4e9e6e13fe99e602ef42 です この時点では気づかないかもしれませんが、ログインするとログインできなくなります。新しいユーザーを登録する必要があります。たとえば、パスワードは wwwwww のままです。ログインしてもログインできません。暗号化エラーがあることを疑うしかありません。その後、データが完了した「setPasswordAttr()」が見つかります。 「別に取り出してテストしてください答えだけ教えてください、修飾子とデータを何度も見て、2時間かけてテストを完了して、ようやくわかりました」新しいテスト テーブル
//新建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返回的结果】ログイン後にコピー
理由を見つける実行後setPasswordAttr() は 2 回実行されるため、パスワードも 2 回暗号化されます;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' ]); } }ログイン後にコピー
2 回暗号化される理由は、値を割り当てるときに 1 回、$auto が自動的に完了するときに 1 回暗号化されるためです。数据完成:在数据字段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"】ログイン後にコピー
[ '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"【加密结果】
ログイン後にコピー
数据完成:在数据字段insert,update,auto时进行处理 string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】 string(6) "wwwwww"【$value】 string(32) "d785c99d298a4e9e6e13fe99e602ef42"【加密结果】
ログイン後にコピー
複数のフィールドがある場合 protected $auto = ['password','create']; パスワードを削除するだけ protected $auto = [ ' create']; したがって、元の問題は解決されます。
データだけが完成し、値が割り当てられていない場合上で私が常に 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'
]);
}
}
ログイン後にコピー
実行後の暗号化は NULLnamespace 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' ]); } }
ログイン後にコピー
数据完成:在数据字段insert,update,auto时进行处理 string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密NULL】 NULL【没有传值,$value=NULL】 string(32) "d41d8cd98f00b204e9800998ecf8427e"【加密$value,刚好等于NULL加密结果】ログイン後にコピー
残りの $update および $insert の使用方法$auto と同様、$auto には $update と $insert が含まれます
概要修飾子は代入時に実行されます。データ補完は代入時に 1 回、書き込み時に 1 回の計 2 回実行されます。データ入力時に開発時間が無駄になるので、マニュアルがもう少し詳しくなるといいのですが、誰もが落とし穴を避けることができるように、これを共有したいと思います。何か間違っていることがあれば修正してください。ありがとうございます