防抖(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種實現防抖的方法,每種方法都附帶一個簡單的程式碼示例:
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']);
}
Token 防抖:
利用隨機生成的 token 來防止重複提交。
$token = md5(uniqid());
echo '<input type="hidden" name="submit_token" value="' . $token . '">';
if ($_POST['submit_token'] === $token) {
// 處理表單提交
}
時間戳防抖:
利用時間戳來防止在一段時間內的重複提交。
$currentTime = time();
$lastSubmitTime = $_SESSION['last_submit_time'] ?? 0;
if ($currentTime - $lastSubmitTime > 5) {
// 處理表單提交
$_SESSION['last_submit_time'] = $currentTime;
}
IP 地址防抖:
利用 IP 地址來防止相同 IP 的重複提交。
$userIP = $_SERVER['REMOTE_ADDR'];
$lastSubmitIP = $_SESSION['last_submit_ip'] ?? '';
if ($userIP !== $lastSubmitIP) {
// 處理表單提交
$_SESSION['last_submit_ip'] = $userIP;
}
Cookie 防抖:
利用 Cookie 來防止在一段時間內的重複提交。
if (!isset($_COOKIE['submit_cookie'])) {
// 處理表單提交
setcookie('submit_cookie', 'submitted', time() + 60); // 60秒內不允許重複提交
}
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>
延時防抖:
在最後一次操作後的一段時間內,只執行一次提交操作。
if (!isset($_SESSION['submit_timer'])) {
$_SESSION['submit_timer'] = time();
}
if (time() - $_SESSION['submit_timer'] > 10) {
// 處理表單提交
$_SESSION['submit_timer'] = time();
}
資料庫唯一性約束:
利用資料庫的唯一性約束來防止重複插入資料。
try {
// 嘗試插入資料,如果插入失敗會丟擲異常
// 新增資料庫的唯一性索引或唯一性約束以防止重複資料
} catch (Exception $e) {
// 處理插入失敗的情況
}
快取防抖:
利用快取系統來記錄提交狀態。
$cacheKey = 'submit_status_' . $userIP;
if (!cache_get($cacheKey)) {
// 處理表單提交
cache_set($cacheKey, 'submitted', 60); // 60秒內不允許重複提交
}
驗證碼防抖:
要求使用者輸入特定的驗證碼來提交表單,防止惡意重複提交。
if ($_POST['captcha'] === $_SESSION['captcha_code']) {
// 處理表單提交
// 清除驗證碼,以防止多次使用同一個驗證碼
unset($_SESSION['captcha_code']);
}
這些示例程式碼展示了不同的防抖方法,你可以根據你的需求選擇適合的方法來防止重複提交。請注意,這些方法可能需要根據你的具體應用場景進行適當的調整和最佳化。
本作品採用《CC 協議》,轉載必須註明作者和本文連結