当前位置: 首页 > 知识库问答 >
问题:

为什么我的数据不存储在数据库使用雄辩?

范建华
2023-03-14

我的表单已提交,但未存储在表中。如果我对请求执行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>

共有1个答案

袁鹤轩
2023-03-14

我在你的代码中看到了很多问题。让我们先把它们列出来,这样你就知道你做错了什么

'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数据库中。这是我使用的代码: 问题是当我保存值时,整个值被插入到一个单元格中。我希望每行的值分开,然后插入到每行的单个单元格中,尽管我使用扫描器方法插入数据,但它不起作用。那有什么办法吗?