PHP如何實現(xiàn)防止重復(fù)提交
防抖(Debounce)是一種防止重復(fù)提交的策略,它通過延遲一定時間來合并連續(xù)的操作,以確保只執(zhí)行一次。
以下是幾種防抖的實現(xiàn)方法以及對應(yīng)的代碼示例:
1. 前端 JavaScript 實現(xiàn)
在前端使用 JavaScript 實現(xiàn)防抖,可以利用 setTimeout 函數(shù)來延遲執(zhí)行提交操作。
function debounce(func, delay) { let timer; return function() { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, arguments); }, delay); }; } ???????const submitForm = debounce(function() { // 在這里執(zhí)行表單提交操作 }, 1000); // 延遲 1 秒執(zhí)行
2. 后端 PHP 實現(xiàn)(使用 Session)
在后端使用 Session 可以防止重復(fù)提交。在提交之前,將一個 token 存儲在 Session 中,然后在提交后驗證 token 是否匹配。
session_start(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { $token = uniqid(); // 生成唯一的 token $_SESSION['submit_token'] = $token; // 執(zhí)行表單提交操作 unset($_SESSION['submit_token']); // 清除 token }
3. 后端 PHP 實現(xiàn)(使用 Token)
在每次頁面加載時生成一個唯一的 Token,并將其存儲在表單中。當(dāng)表單提交時,驗證 Token 是否匹配。
if ($_SERVER['REQUEST_METHOD'] === 'POST') { $submittedToken = $_POST['token']; $storedToken = $_SESSION['submit_token']; ??????? if ($submittedToken === $storedToken) { // 執(zhí)行表單提交操作 unset($_SESSION['submit_token']); // 清除 token } }
請注意,以上代碼示例是基本的防抖方法。在實際應(yīng)用中,你可能需要根據(jù)業(yè)務(wù)需求進行適當(dāng)?shù)恼{(diào)整和擴展。同時,為了更好地防止重復(fù)提交,還可以結(jié)合使用前端和后端的方法來確保數(shù)據(jù)的安全性。
PHP 防抖(防重復(fù)提交)有哪些實現(xiàn)方法,這里列出10個
防抖(Debounce)是一種常用的防止重復(fù)提交的方法,它可以確保在短時間內(nèi)只執(zhí)行一次提交操作,以避免重復(fù)提交造成的問題。以下是10種實現(xiàn)防抖的方法,每種方法都附帶一個簡單的代碼示例:
1 Session Token 防抖
利用會話(Session)中的 token 來防止重復(fù)提交。
// 生成隨機的 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']); }
2 Token 防抖
利用隨機生成的 token 來防止重復(fù)提交。
$token = md5(uniqid()); echo '<input type="hidden" name="submit_token" value="' . $token . '">'; ???????if ($_POST['submit_token'] === $token) { // 處理表單提交 }
3 時間戳防抖
利用時間戳來防止在一段時間內(nèi)的重復(fù)提交。
$currentTime = time(); $lastSubmitTime = $_SESSION['last_submit_time'] ?? 0; ???????if ($currentTime - $lastSubmitTime > 5) { // 處理表單提交 $_SESSION['last_submit_time'] = $currentTime; }
4 IP 地址防抖
利用 IP 地址來防止相同 IP 的重復(fù)提交
$userIP = $_SERVER['REMOTE_ADDR']; $lastSubmitIP = $_SESSION['last_submit_ip'] ?? ''; ???????if ($userIP !== $lastSubmitIP) { // 處理表單提交 $_SESSION['last_submit_ip'] = $userIP; }
5 Cookie 防抖
利用 Cookie 來防止在一段時間內(nèi)的重復(fù)提交。
if (!isset($_COOKIE['submit_cookie'])) { // 處理表單提交 setcookie('submit_cookie', 'submitted', time() + 60); // 60秒內(nèi)不允許重復(fù)提交 }
6 JavaScript 防抖
利用 JavaScript 來控制提交按鈕的可點擊狀態(tài),以防止重復(fù)點擊。
<button id="submitBtn" οnclick="submitForm()">Submit</button> <script> let submitting = false; ??????? function submitForm() { if (!submitting) { submitting = true; // 執(zhí)行表單提交操作 document.getElementById('submitBtn').disabled = true; } } </script>
7 延時防抖
在最后一次操作后的一段時間內(nèi),只執(zhí)行一次提交操作。
if (!isset($_SESSION['submit_timer'])) { $_SESSION['submit_timer'] = time(); } ???????if (time() - $_SESSION['submit_timer'] > 10) { // 處理表單提交 $_SESSION['submit_timer'] = time(); }
8 數(shù)據(jù)庫唯一性約束
利用數(shù)據(jù)庫的唯一性約束來防止重復(fù)插入數(shù)據(jù)。
try { // 嘗試插入數(shù)據(jù),如果插入失敗會拋出異常 // 添加數(shù)據(jù)庫的唯一性索引或唯一性約束以防止重復(fù)數(shù)據(jù) } catch (Exception $e) { // 處理插入失敗的情況 }
9 緩存防抖
利用緩存系統(tǒng)來記錄提交狀態(tài)。
$cacheKey = 'submit_status_' . $userIP; if (!cache_get($cacheKey)) { // 處理表單提交 cache_set($cacheKey, 'submitted', 60); // 60秒內(nèi)不允許重復(fù)提交 }
10驗證碼防抖
要求用戶輸入特定的驗證碼來提交表單,防止惡意重復(fù)提交。
if ($_POST['captcha'] === $_SESSION['captcha_code']) { // 處理表單提交 // 清除驗證碼,以防止多次使用同一個驗證碼 unset($_SESSION['captcha_code']); }
這些示例代碼展示了不同的防抖方法,你可以根據(jù)你的需求選擇適合的方法來防止重復(fù)提交。請注意,這些方法可能需要根據(jù)你的具體應(yīng)用場景進行適當(dāng)?shù)恼{(diào)整和優(yōu)化。
到此這篇關(guān)于PHP如何實現(xiàn)防止重復(fù)提交的文章就介紹到這了,更多相關(guān)PHP防止重復(fù)提交內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
實例講解通過PHP創(chuàng)建數(shù)據(jù)庫
在本篇文章里小編給大家分享了關(guān)于如何通過​PHP創(chuàng)建數(shù)據(jù)庫的知識點內(nèi)容,有需要的朋友們學(xué)習(xí)下。2019-01-01解決PHP程序運行時:Fatal error: Maximum execution time of 30 seconds
最近做的程序中涉及到的循環(huán)比較多且處理的情況較復(fù)雜,在運行程序時出現(xiàn)執(zhí)行超時提示如下:Fatal error: Maximum execution time of 30 seconds exceeded in D:\php\AppServ\www\sum3\test.php on line 3通過在網(wǎng)上搜索,找到了解決方法和大家分享,下面來一起看看吧。2016-11-11PHP基于迭代實現(xiàn)文件夾復(fù)制、刪除、查看大小等操作的方法
這篇文章主要介紹了PHP基于迭代實現(xiàn)文件夾復(fù)制、刪除、查看大小等操作的方法,簡單說明了迭代的原理并結(jié)合實例形式分析了php采用迭代算法實現(xiàn)文件夾的復(fù)制、刪除及查看大小等常見操作的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-08-08php實現(xiàn)將base64格式圖片保存在指定目錄的方法
這篇文章主要介紹了php實現(xiàn)將base64格式圖片保存在指定目錄的方法,涉及php針對圖片文件的傳輸、判定及轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2016-10-10php常用字符串查找函數(shù)strstr()與strpos()實例分析
這篇文章主要介紹了php常用字符串查找函數(shù)strstr()與strpos(),結(jié)合具體實例形式分析了php字符串查找函數(shù)strstr()與strpos()的具體功能、用法、區(qū)別及相關(guān)操作注意事項,需要的朋友可以參考下2019-06-06