在 PHP 開發中,處理表單提交是家常便飯,但「使用者刷新頁面導致重複提交」卻是讓許多開發者頭痛的經典問題。最直觀的解法是採用 PRG 模式——提交成功後立即重導向,但若頁面包含大量動態內容或需頻繁與後端互動,跳轉重載會增加伺服器負擔,影響使用者體驗。
更優雅的做法是引入 Session 機制:在表單初始化時建立一個唯一標識(Token),提交時驗證並更新該標識。若使用者重新整理頁面再次提交,Token 已失效,即可攔截重複請求。
<?php
session_start();
// 初始化 Token
if (!isset($_SESSION['form_token'])) {
$_SESSION['form_token'] = 0;
}
// 處理表單提交
if (isset($_POST['action']) && $_POST['action'] === 'submit') {
if ($_SESSION['form_token'] === 0) {
// 首次提交:執行業務邏輯
echo '<a href="' . $_SERVER['PHP_SELF'] . '">請再次嘗試</a>';
$_SESSION['form_token'] = 1; // 更新 Token
} else {
// 重複提交:給予友善提示
echo '您已經提交過了,請不要重複提交';
}
}
?>
前端表單需包含隱藏欄位 action,值為 submit,配合後端驗證流程。此法不需跳轉,避免重複載入頁面資源,適合高互動場景。
實務上還可結合「一次性 Token」(CSRF Token)同時防範跨站請求偽造,或使用 JavaScript 在提交後禁用按鈕、鎖定表單,從前後端雙重保障資料完整性。