使用随机令牌检查 Laravel 在多次点击时重复数据

Duplicate data on multiple clicks using random token check Laravel

提问人:Hashaam Ahmed 提问时间:8/16/2019 最后编辑:AndronicusHashaam Ahmed 更新时间:12/29/2019 访问量:958

问:

我有一个表单,我正在向数据库添加一些数据,但是如果用户多次单击按钮,我想避免重复记录,我可以使用JS禁用该按钮,但我也想在服务器端进行一些检查。

目前在表单上,我正在设置一个带有随机数的会话变量,并使用文本框(隐藏)将其发送到控制器,然后在控制器中我检查会话变量是否等于文本框,然后添加到数据库 - 但数据仍然在数据库中添加多次,如果有人可以提供帮助,将不胜感激。谢谢。

控制器:

if ($request->token == session('test')){
    session()->forget('test');
    sleep(20); (this i added in order to test)
    TableName::create([
        'code' => 'test',
        'name' => 'testing',
    ]);
    return "done";
} else {
    return "stopped";
}

叶片:

{{session(['test'=> rand()])}}
<input type="text" value="{{session('test')}}" name="token">
PHP Laravel 验证 服务器端

评论

0赞 Regolith 8/16/2019
单击时,通过 JavaScript 禁用该按钮
0赞 8/16/2019
您可以创建哈希值来预检查 sql 中的输入,或者如果必须,请将列更改为唯一以避免重复。
0赞 Japs 8/16/2019
如果您使用的是 Laravel Yung 可以在您的验证控制器上使用函数unique
0赞 Jack jdeoel 8/16/2019
在该列上设置唯一键将有很大帮助

答:

0赞 Mahesh 8/16/2019 #1

您可以检查MYSQL中不存在,检查下面

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;
1赞 Rp9 8/16/2019 #2

Laravel 中有两种方法:firstOrCreate 或 firstOrNew

请参阅 https://laravel.com/docs/5.8/eloquent

firstOrNew 方法(如 firstOrCreate)将尝试在数据库中查找与给定属性匹配的记录。但是,如果找不到模型,则将返回新的模型实例

// Retrieve flight by name, or create it with the name, delayed, and arrival_time attributes...
$flight = App\Flight::firstOrCreate(
    ['name' => 'Flight 10'],
    ['delayed' => 1, 'arrival_time' => '11:30']
);