PHP 防抖(防重複提交)有哪些實現方法,具體程式碼

Laravel00發表於2023-09-04

防抖(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 全家桶賬號&& 正式版啟用碼 推薦: 點選這裡免費獲取

相關文章