我的表单已提交,但未存储在表中。如果我对请求执行dd(),则数据在中,但当我执行save()时,它不会按预期工作。我想在backoffice表单上添加用户,仅包含姓名、电子邮件、用户类型和密码。
编辑:我将问题图像更改为代码,以便您更容易理解,很抱歉第一次尝试。编辑2:现在出现了更多的两件事,密码验证确认总是错误的,如果我跳过验证,则会出现以下错误:
对未定义方法App\User::forget()的BadMethodCallException调用
控制器上的功能存储:
public function store(Request $request)
{
$dados = $request->validate(
[
'name' =>'required|min:2|max:20',
'email' =>'required|email|unique:App\User,email',
'password' =>'required|min:8',
'password_confirmation' =>'confirmed'
],
[
'required' =>'Os campos têm de ser todos preenchidos!',
'email' =>'O email tem de ser válido!',
'unique'=>'O email inserido já está registado!',
'min.name' =>'O nome tem de ter pelo menos 2 caracteres!',
'min.password' =>'A password tem de ter no minimo 8 caracteres!',
'confirmed' =>'As passwords deverão coincidir!'
]
);
$user = new User;
$user->forget('password_confirmation');
$user->fill($request->all());
$user->save();
return redirect()->route('utilizadores.index')->with('Success','Utilizador registado com sucesso!');
}
路线:
Route::resource('/admin/utilizadores', 'UserController');
型号:
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $guarded = [
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token','password_confirmation'
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
}
表格:
<div class="modal-body">
<form action="{{route('utilizadores.store')}}" method="POST" id="adicionarid">
@csrf
<input type="email" name="email" class="inputtext data" placeholder="Email">
<div class="customselect data top1">
<select name="tipo">
<option value="revisor" selected disabled>Revisor</option>
<option value="editor">Editor</option>
<option value="revisor">Revisor</option>
</select>
</div>
<input type="text" name="name" class="inputtext" placeholder="Nome">
<input type="password" name="password" class="inputtext" placeholder="Palavra-passe">
<input type="password" name="password_confirmation" class="inputtext" placeholder="Confirmar palavra-passe">
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Fechar</button>
<button type="submit" class="btn btn-success" form="adicionarid">Guardar</button>
</div>
我在你的代码中看到了很多问题。让我们先把它们列出来,这样你就知道你做错了什么
'password_confirmation' =>'confirmed'
我很确定这不会达到你期望的效果。确认
验证规则必须用于密码
,然后laravel将自动检查是否有名为密码确认
(字段名确认
)的字段,并检查其是否等于密码
字段。因此,您的验证规则可以是
'password' =>'required|min:8|confirmed',
而且不需要关于密码确认的规则
其次是
$user->forget('password_confirmation');
在eloquent或laravel的查询生成器中没有“忘记”方法,因此
对未定义方法App\User::forget()的BadMethodCallException调用
在集合和Arr::forget()上有忘记方法,但这不是您想要的。但是由于您已经有了$dados
,它将是一个数组,只包含您在验证器中定义了规则的输入字段,因此您可以在创建用户时使用$dados
(将在后面的答案中显示如何)
其次是
$user->fill($request->all());
永远不要这样做,因为恶意用户可以在表单中添加额外的字段,例如id
,从而允许他们修改现有用户。
相反,你可以这样做
$user->fill($dados);
由于$dados
只包含验证器返回的字段,因此使用起来更安全。
我注意到的另一个问题是表单中有一个名为tipo
的字段,但它不在验证器中,因此需要将其添加到验证器中。
$dados = $request->validate(
[
'name' =>'required|min:2|max:20',
'email' =>'required|email|unique:App\User,email',
'password' =>'required|min:8|confirmed',
'tipo' =>'required' // Add whatever other validations you need
],
[
'required' =>'Os campos têm de ser todos preenchidos!',
'email' =>'O email tem de ser válido!',
'unique'=>'O email inserido já está registado!',
'min.name' =>'O nome tem de ter pelo menos 2 caracteres!',
'min.password' =>'A password tem de ter no minimo 8 caracteres!',
'confirmed' =>'As passwords deverão coincidir!'
]
);
那你就做吧
$user = new User;
$user->fill($dados);
$user->save();
下一个问题是,您没有散列密码。除非您想直接将用户密码保存在数据库中,否则您应该散列密码;Laravel通过提供一个可以使用的Hash
类使哈希变得简单。
$dados['password'] = Hash::make($request->password);
确保添加使用light\Support\Facades\Hash
位于文件的顶部
所以总的来说,通过一些调整,你的控制器应该
public function store(Request $request)
{
$dados = $request->validate(
[
'name' =>'required|min:2|max:20',
'email' =>'required|email|unique:App\User,email',
'password' =>'required|min:8|confirmed',
'tipo' =>'required' // Add whatever other validations you need
],
[
'required' =>'Os campos têm de ser todos preenchidos!',
'email' =>'O email tem de ser válido!',
'unique'=>'O email inserido já está registado!',
'name.min' =>'O nome tem de ter pelo menos 2 caracteres!',
'password.min' =>'A password tem de ter no minimo 8 caracteres!',
]
);
$dados['password'] = Hash::make($request->password);
$user = new User;
$user->fill($dados);
$user->save();
return redirect()->route('utilizadores.index')->with('Success','Utilizador registado com sucesso!');
}
它应该能达到你的期望
现在,让我们给你一些额外的提示。
始终避免使用空的
$guarded
protected $guarded = [
];
它可能会留下安全漏洞(即使你没有暴露任何这样的漏洞,粗心的人也可能会暴露,所以总是尝试使用$fillable
,安全总比抱歉好)
protected $fillable = [
'name', 'email', 'password', 'tipo'
];
然后在你的控制器里,你可以安全地使用
$user = User::create($dados);
这是一种比fill()
更广泛使用的方法。$filleble
数组还确保在使用create()
时,只有$filleble
数组中的属性才能保存在数据库中
随着互联网技术的高速发展,预计2020 年底全世界网民的数量将达到 50 亿。网民数量的增加带动了网上购物、微博,网络视频等产业的发展。那么,随之而来的就是庞大的网络数据量。 大量的数据正在不断产生,那么如何安全有效地存储、检索,管理它们呢?于是对数据的有效存储、高效访问、方便共享和安全控制等问题成为了信息时代一个非常重要的问题。 使用数据库可以高效且条理分明地存储数据,它使人们能够更加迅速和方便
我正在创建一个Android应用程序,将数据保存在SQLite数据库中,然后从同一个数据库读取数据。这样一来,我就不需要每次将数据联机到MySQL服务器。我将其连接到一个外部数据库,提取数据,并尝试查看数据是否正在保存,但当我尝试使用函数从SQLite数据库获取数据时,它似乎是空的 对于获取数据的类,数据会保存下来,当我试图检查它时,它会告诉我它是空的 所以我为测试添加了这个函数,并将其命名为On
问题内容: 即时通讯试图将我的用户使用网络表单输入的长文本(约2500个字符)保存到我的数据库中,并使用php传递给服务器。 当我在phpmyadmin中查看时,文本会变大。如何配置表格以获得完整的文本?这是我的表配置: 看一看具有3000个字符限制的字段 内容 ,但是文本总是以 690个字符为准 。谢谢你的帮助! 编辑 :我发现了问题,但我不知道如何解决。查询总是以相同的char形式获取农作物,
本文向大家介绍详解Android数据存储—使用SQLite数据库,包括了详解Android数据存储—使用SQLite数据库的使用技巧和注意事项,需要的朋友参考一下 SQLite是Android自带的关系型数据库,是一个基于文件的轻量级数据库。Android提供了3种操作数据的方式,SharedPreference(共享首选项)、文件存储以及SQLite数据库。 SQLite数据库文件被保存在/da
我创建了一个TextView,它以多行显示值 ,我希望将该值保留在SQLite数据库中。这是我使用的代码: 问题是当我保存值时,整个值被插入到一个单元格中。我希望每行的值分开,然后插入到每行的单个单元格中,尽管我使用扫描器方法插入数据,但它不起作用。那有什么办法吗?