PHP 防抖(防重复提交)有哪些实现方法,具体代码

防抖(Debounce)是一种防止重复提交的策略,它通过延迟一定时间来合并连续的操作,以确保只执行一次。以下是几种防抖的实现方法以及对应的代码示例:

1. 前端 JavaScript 实现:

在前端使用 JavaScript 实现防抖,可以利用 setTimeout 函数来延迟执行提交操作。


function  debounce(func, delay) {

 let timer;

 return  function() {

 clearTimeout(timer);

timer =  setTimeout(() => {

            func.apply(this, arguments);

        }, delay);

    };

}

const submitForm =  debounce(function() {

 // 在这里执行表单提交操作

}, 1000); // 延迟 1 秒执行

2. 后端 PHP 实现(使用 Session):

在后端使用 Session 可以防止重复提交。在提交之前,将一个 token 存储在 Session 中,然后在提交后验证 token 是否匹配。


session_start();

if ($_SERVER['REQUEST_METHOD'] ===  'POST') {

$token =  uniqid(); // 生成唯一的 token

    $_SESSION['submit_token'] = $token;

 // 执行表单提交操作

 unset($_SESSION['submit_token']); // 清除 token

}

3. 后端 PHP 实现(使用 Token):

在每次页面加载时生成一个唯一的 Token,并将其存储在表单中。当表单提交时,验证 Token 是否匹配。


if ($_SERVER['REQUEST_METHOD'] ===  'POST') {

$submittedToken = $_POST['token'];

$storedToken = $_SESSION['submit_token'];

 if ($submittedToken === $storedToken) {

 // 执行表单提交操作

 unset($_SESSION['submit_token']); // 清除 token

    }

}

请注意,以上代码示例是基本的防抖方法。在实际应用中,你可能需要根据业务需求进行适当的调整和扩展。同时,为了更好地防止重复提交,还可以结合使用前端和后端的方法来确保数据的安全性。

PHP 防抖(防重复提交)有哪些实现方法,这里列出10个

防抖(Debounce)是一种常用的防止重复提交的方法,它可以确保在短时间内只执行一次提交操作,以避免重复提交造成的问题。以下是10种实现防抖的方法,每种方法都附带一个简单的代码示例:

  1. Session Token 防抖:

    利用会话(Session)中的 token 来防止重复提交。


// 生成随机的 token

$token =  md5(uniqid());

// 存储 token 到会话

$_SESSION['submit_token'] = $token;

// 在表单中嵌入 token

echo  '<input type="hidden" name="submit_token" value="'  . $token .  '">';

// 处理表单提交时的校验

if ($_POST['submit_token'] === $_SESSION['submit_token']) {

 // 处理表单提交

 // 清除会话中的 token

 unset($_SESSION['submit_token']);

}
  1. Token 防抖:

    利用随机生成的 token 来防止重复提交。


$token =  md5(uniqid());

echo  '<input type="hidden" name="submit_token" value="'  . $token .  '">';

if ($_POST['submit_token'] === $token) {

 // 处理表单提交

}
  1. 时间戳防抖:

    利用时间戳来防止在一段时间内的重复提交。


$currentTime =  time();

$lastSubmitTime = $_SESSION['last_submit_time'] ??  0;

if ($currentTime - $lastSubmitTime >  5) {

 // 处理表单提交

    $_SESSION['last_submit_time'] = $currentTime;

}
  1. IP 地址防抖:

    利用 IP 地址来防止相同 IP 的重复提交。


$userIP = $_SERVER['REMOTE_ADDR'];

$lastSubmitIP = $_SESSION['last_submit_ip'] ??  '';

if ($userIP !== $lastSubmitIP) {

 // 处理表单提交

    $_SESSION['last_submit_ip'] = $userIP;

}
  1. Cookie 防抖:

    利用 Cookie 来防止在一段时间内的重复提交。


if (!isset($_COOKIE['submit_cookie'])) {

 // 处理表单提交

 setcookie('submit_cookie', 'submitted', time() +  60); // 60秒内不允许重复提交

}
  1. JavaScript 防抖:

    利用 JavaScript 来控制提交按钮的可点击状态,以防止重复点击。


<button  id="submitBtn"  onclick="submitForm()">Submit</button>

<script>

 let submitting =  false;

 function  submitForm() {

 if (!submitting) {

submitting =  true;

 // 执行表单提交操作

            document.getElementById('submitBtn').disabled =  true;

        }

    }

</script>
  1. 延时防抖:

    在最后一次操作后的一段时间内,只执行一次提交操作。


if (!isset($_SESSION['submit_timer'])) {

    $_SESSION['submit_timer'] =  time();

}

if (time() - $_SESSION['submit_timer'] >  10) {

 // 处理表单提交

    $_SESSION['submit_timer'] =  time();

}
  1. 数据库唯一性约束:

    利用数据库的唯一性约束来防止重复插入数据。


try {

 // 尝试插入数据,如果插入失败会抛出异常

 // 添加数据库的唯一性索引或唯一性约束以防止重复数据

} catch (Exception $e) {

 // 处理插入失败的情况

}
  1. 缓存防抖:

    利用缓存系统来记录提交状态。


$cacheKey =  'submit_status_'  . $userIP;

if (!cache_get($cacheKey)) {

 // 处理表单提交

 cache_set($cacheKey, 'submitted', 60); // 60秒内不允许重复提交

}
  1. 验证码防抖:

    要求用户输入特定的验证码来提交表单,防止恶意重复提交。


if ($_POST['captcha'] === $_SESSION['captcha_code']) {

 // 处理表单提交

 // 清除验证码,以防止多次使用同一个验证码

 unset($_SESSION['captcha_code']);

}

这些示例代码展示了不同的防抖方法,你可以根据你的需求选择适合的方法来防止重复提交。请注意,这些方法可能需要根据你的具体应用场景进行适当的调整和优化。

本作品采用《CC 协议》,转载必须注明作者和本文链接
程序员的福利:免费获取 JetBrains 全家桶激活码 推荐:【点击这里获取 。。。激活码适用:AppCode, CLion, DataGrip, DataSpell, dotCover, dotMemory, dotTrace, goland, IntelliJ IDEA Ultimate, phpstorm, pycharm, ReSharper
Laravel00
讨论数量: 4

前端disabled,后端自己做幂等,特殊业务加锁,加提交次数限制能避免90%的场景

7个月前 评论

我们选用缓存处理的

7个月前 评论
巴啦啦

一般后端防抖,只用记住一点,就是发令牌,有令牌才能提交,但还不完整,需要加锁。

6个月前 评论

我们是加redis锁

5个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
资深程序猿 @ XX科技
文章
62
粉丝
37
喜欢
249
收藏
574
排名:282
访问:3.3 万
私信
所有博文
社区赞助商