php-パスワード入力なしでフォームを送信するときに、Laravelがデータベースにランダムなパスワードを挿入します
パスワード入力フィールドのないフォームを送信するときに、データベースにランダムなパスワードを挿入したい。
私のモデルUser.php
protected $fillable = [
'email', 'firstname', 'lastname'
];
public function setpasswordAttribute($value)
{
$this->attributes['password'] = bcrypt($value ?: str_random(10));
}
私のコントローラー
public function store(Request $request)
{
User::create(Request::all());
return 'test';
}
私のデータベース
id
firstname
lastname
password
created_at
updated_at
私のエラー
SQLSTATE[HY000]: General error: 1364 Field 'password' doesn't have a default value
(SQL: insert into `users` (`email`, `firstname`, `lastname`, `updated_at`, `created_at`)
答え :
解決策:
SQLSTATE [HY000]:一般エラー:1364フィールド'password'にデフォルト値がありません(SQL: users に挿入( email 、 firstname 、 lastname 、 updated_at 、 created_at )
デフォルトのcreate_ users _table
移行ではpasswordフィールドにデフォルト値が提供されないため、このエラーが発生します。値としてnullを許可します。
電話するとき
User::create($request->all());
laravelはデータベースへの挿入クエリを実行し、 password が設定されていないため、MySQLは `SQLSTATE [HY000]
を返します。
これを解決するには、新しく作成されたlaravelプロジェクトでデフォルトで提供されていた create _ users _table
の移行を変更します。
Schema :: create('users'、function(Blueprint $ table){
//他のテーブル列はここにあります
$ table-> string('password')-> nullable();
// また
$ table-> string('password')-> default( "");
//他のテーブル列はここにあります
});
これにより、passwordを指定せずに新しいユーザーを作成でき、その列は「」に設定されるか、私が提案するように移行を変更するために使用する方法に応じて空のままになります
次に、モデルで setPasswordAttribute を無視しても、passwordなしで新しいユーザーを作成すると、自動的にpasswordが設定されるわけではありません。その上で、データベースにユーザーを挿入する前に creating
イベントをキャッチすることでそれを行うことができます。
これを行うには、これを EventServiceProvider
に追加します
class EventServiceProvider extends ServiceProvider
{{
/ **
*アプリケーションのイベントを登録します。
*
* @return void
* /
パブリック関数boot()
{{
parent :: boot();
User :: creating(function($ user){
if($ user-> password === "" || empty($ user-> password)){
$ user-> password = bcrypt(str_random(10));;
}
})
}
}
このイベントは、ユーザーがデータベースに永続化される前にトリガーされます。これにより、データベースに永続化するユーザーにすでに設定されているすべての属性に変更を加えることができます。
SQLSTATE [HY000]:一般エラー:1364フィールド'password'にデフォルト値がありません(SQL: デフォルトの 電話するとき laravelはデータベースへの挿入クエリを実行し、 これを解決するには、新しく作成されたlaravelプロジェクトでデフォルトで提供されていた これにより、passwordを指定せずに新しいユーザーを作成でき、その列は「」に設定されるか、私が提案するように移行を変更するために使用する方法に応じて空のままになります
次に、モデルで これを行うには、これを このイベントは、ユーザーがデータベースに永続化される前にトリガーされます。これにより、データベースに永続化するユーザーにすでに設定されているすべての属性に変更を加えることができます。 users に挿入(
email 、
firstname 、
lastname 、
updated_at 、
created_at )
create_ users _table
移行ではpasswordフィールドにデフォルト値が提供されないため、このエラーが発生します。値としてnullを許可します。
User::create($request->all());
password が設定されていないため、MySQLは `SQLSTATE [HY000]
create _ users _table
の移行を変更します。 Schema :: create('users'、function(Blueprint $ table){
//他のテーブル列はここにあります
$ table-> string('password')-> nullable();
// また
$ table-> string('password')-> default( "");
//他のテーブル列はここにあります
});
setPasswordAttribute を無視しても、passwordなしで新しいユーザーを作成すると、自動的にpasswordが設定されるわけではありません。その上で、データベースにユーザーを挿入する前に
creating
イベントをキャッチすることでそれを行うことができます。 EventServiceProvider
class EventServiceProvider extends ServiceProvider
{{
/ **
*アプリケーションのイベントを登録します。
*
* @return void
* /
パブリック関数boot()
{{
parent :: boot();
User :: creating(function($ user){
if($ user-> password === "" || empty($ user-> password)){
$ user-> password = bcrypt(str_random(10));;
}
})
}
}
答え :
解決策:
問題はコントローラーにあります。User::create(Request::all());にはパスワードパラメーターがなく、mysqlは正しいエラーを出します:
{ -code-2}
。
これはあなたがそれについてできることです:
public function store(Request $ request)
{{
$ input = Request :: all();
$ input [password] = $ input [password]? $ input [password]:bcrypt(str_random(10))
{-コード-1}
'テスト'を返します。
}
答え :
解決策:
リクエストにパスワードが入力されているかどうかを確認し、パスワードが存在しない場合は、偽造してください:
public function store(Request $request)
{
if (!$request->has('password')) {
$password = str_random(8);
$request->request->add(['password' => bcrypt($password)]);
}
User::create($request->all());
return 'test';
}
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。