Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel-我的双重提交解决方案有效吗_Php_Laravel - Fatal编程技术网

Php Laravel-我的双重提交解决方案有效吗

Php Laravel-我的双重提交解决方案有效吗,php,laravel,Php,Laravel,这是我的第一个问题,所以请对我放轻松。我已经用了一段时间了;然而,最近我在测试客户机应用程序时遇到了一个问题 问题是,如果用户重复提交或简单地单击提交按钮x次,那么相同的记录将在数据库中创建x次 我以前从未遇到过这个问题,因为简单的唯一验证可以实现这一点 然而,此表单(确切地说是模型)允许数据具有相同的值/重复项(客户端应用程序要求)。 所以我做的第一件事是: public function store(CustomRequest $request) { if($lastEntry =

这是我的第一个问题,所以请对我放轻松。我已经用了一段时间了;然而,最近我在测试客户机应用程序时遇到了一个问题

问题是,如果用户重复提交或简单地单击提交按钮x次,那么相同的记录将在数据库中创建x次

我以前从未遇到过这个问题,因为简单的唯一验证可以实现这一点

然而,此表单(确切地说是模型)允许数据具有相同的值/重复项(客户端应用程序要求)。

所以我做的第一件事是:

public function store(CustomRequest $request)
{
    if($lastEntry = Record::latest()->first()){
        if(
            ($request->name == $lastEntry->name)
            && ($request->another == $lastEntry->another)
            //  && ($request->user()->id == $lastEntry->user_id) // Current user check (need to modify the $lastEntry for it to work efficiently!)
            && (now()->diffInMinutes($lastEntry->created_at) < 5) // I added this later as another way to allow duplicates records after each other if they were created 5m apart
        ){
            return redirect()
                    ->route('show.record', $lastEntry->id)
                    ->with('success', 'Record has been created successfully.');
        }
    }

    $record= new Record();
    ....
}

公共功能存储(CustomRequest$request)
{
如果($lastEntry=Record::latest()->first()){
如果(
($request->name==$lastEntry->name)
&&($request->other==$lastEntry->other)
//&&($request->user()->id=$lastEntry->user_id)//当前用户检查(需要修改$lastEntry才能有效工作!)
&&(now()->diffInMinutes($lastEntry->created_at)<5)//我后来添加了这个选项,作为另一种方法,如果记录创建间隔为5米,则允许重复记录
){
返回重定向()
->路线('show.record',$lastEntry->id)
->使用('success','记录已成功创建');
}
}
$record=新记录();
....
}
现在,经过测试,它工作得很好。但是,我的问题是,是否有任何内置的解决方案,包还是更好的

另外,我应该做一个会话解决方案来更快地响应吗?因为,如果我错了,请纠正我,但是如果它在一个记录超过500k的表上,这不是很慢吗

编辑:我想为这个做一个定制的节流中间件,但这是个坏主意,你怎么看

另外,正如@nice_dev提到的,如果用户更多,则会出现双精度,因此我考虑在记录表中添加user_id字段,并获取当前用户创建的最后一条记录,但我仍然认为这是一个糟糕的解决方案

不幸的是,Javascript解决方案无法解决此问题

Edit:我所说的Javascript解决方案是一个著名的解决方案,单击按钮后禁用它(任何客户端解决方案)。

顺便说一句,客户端应用程序最终每个表的记录数将超过500k(至少在第一年左右)

请随意修改我的问题,因为你喜欢。。。就像我说的我是新来的


提前感谢

因为,我的情况有点独特,我使用了相同的解决方案,但在记录表(FK)上添加了一个用户id列。并检查同一记录是否由同一用户在最后x分钟内创建(因为客户机需要重复记录,但不允许用户出错)

尽管如此,我还是添加了一个javascript代码来禁用按钮,以防万一。客户要求的是后端解决方案,而不是客户端解决方案。但不妨补充一点,因为我解决了这个问题。此外,我还按照@nice_dev的建议在FK列上创建了一个索引

我必须尽快想出一个解决办法。但是,请随意给出您的想法/解决方案


谢谢

不幸的是,什么是javascript解决方案并不能解决这个问题?除非您处于“无javascript”环境中,否则它实际上是一个很大的帮助;单击“提交”按钮后,您可以禁用该按钮。此外,您当前的解决方案并不能真正解决此问题,因为其他用户可以同时从他们的计算机上进行输入。所以
latest()
不一定会给出相同的结果,用户可能仍然会再次提交。所以只需禁用submit按钮,直到请求完成。您可能希望使用某种会话变量使其更加健壮。@您可以在FK列上创建索引以提高性能。@nice\u dev好主意,谢谢!我不明白您为什么拒绝CSRF解决方案(我知道这不是它的目的,但我认为它会起作用,因为用户需要获得新的CSRF),但我建议在代码的开头和结尾使用
DB::begin()&&DB::commit()
,以便使用事务,因此,不要依赖时间来检查FK&ID是否存在。如果您能够单独依赖JS,我会说确认对话框将大大有助于减少意外提交。@Berto99事务处理的想法似乎很有趣,但不确定它是否有效。但我会尽我所能尝试的。昨天我不得不使用一个快速解决方案,因为需要一个带有补丁的演示。关于CSRF解决方案,我使用的表单是POST,具有\@CSRF输入,并将路由设置为仅POST。所以CSRF已经存在了,但就像我说的,它并没有像你想象的那样工作。我感谢你和所有试图帮助我的人。