• 【黄啊码】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 '';

    // 处理表单提交时的校验
    if ($_POST['submit_token'] === $_SESSION['submit_token']) {
        // 处理表单提交
        // 清除会话中的 token
        unset($_SESSION['submit_token']);
    }

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

    $token = md5(uniqid());
    echo '';

    if ($_POST['submit_token'] === $token) {
        // 处理表单提交
    }

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

    $currentTime = time();
    $lastSubmitTime = $_SESSION['last_submit_time'] ?? 0;

    if ($currentTime - $lastSubmitTime > 5) {
        // 处理表单提交
        $_SESSION['last_submit_time'] = $currentTime;
    }

    4 IP 地址防抖:
    利用 IP 地址来防止相同 IP 的重复提交

    $userIP = $_SERVER['REMOTE_ADDR'];
    $lastSubmitIP = $_SESSION['last_submit_ip'] ?? '';

    if ($userIP !== $lastSubmitIP) {
        // 处理表单提交
        $_SESSION['last_submit_ip'] = $userIP;
    }

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

    if (!isset($_COOKIE['submit_cookie'])) {
        // 处理表单提交
        setcookie('submit_cookie', 'submitted', time() + 60); // 60秒内不允许重复提交
    }

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

    Submit

    7 延时防抖:
    在最后一次操作后的一段时间内,只执行一次提交操作。

    if (!isset($_SESSION['submit_timer'])) {
        $_SESSION['submit_timer'] = time();
    }

    if (time() - $_SESSION['submit_timer'] > 10) {
        // 处理表单提交
        $_SESSION['submit_timer'] = time();
    }

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

    try {
        // 尝试插入数据,如果插入失败会抛出异常
        // 添加数据库的唯一性索引或唯一性约束以防止重复数据
    } catch (Exception $e) {
        // 处理插入失败的情况
    }

    9 缓存防抖:
    利用缓存系统来记录提交状态。

    $cacheKey = 'submit_status_' . $userIP;
    if (!cache_get($cacheKey)) {
        // 处理表单提交
        cache_set($cacheKey, 'submitted', 60); // 60秒内不允许重复提交
    }

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

    if ($_POST['captcha'] === $_SESSION['captcha_code']) {
        // 处理表单提交
        // 清除验证码,以防止多次使用同一个验证码
        unset($_SESSION['captcha_code']);
    }

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

  • 相关阅读:
    (171)Verilog HDL:设计一个卡诺图电路之Exams/m2014 q3
    如何裁剪音频文件?裁剪音频的方法有什么?
    springboot项目中application.properties无法变成小树叶问题解决
    函数栈帧的创建与销毁(保姆级讲解)
    Ubuntu写python脚本实现自定义壁纸幻灯片:字符串拼接法、minidom法
    目标框选之单阶段与两阶段目标检测区别
    LeetCode - 1162 地图分析
    大数据预测模型的深度学习导论
    3 0 XPlanner使用手册
    @Redis--主从复制
  • 原文地址:https://blog.csdn.net/TiaoZhanJi_Xian/article/details/132707423