📅  最后修改于: 2023-12-03 15:18:32.503000             🧑  作者: Mango
表单重新提交是指用户在提交表单后,再次刷新页面或者后退到上一页并重新提交表单。这种行为可能会导致重复提交表单,造成数据错误或者其他问题。为了避免这种情况发生,我们需要在代码中添加一些措施来防止表单重新提交。
最简单的方法是将表单提交到一个新页面上。这可以通过设置表单的 action
属性实现。当用户提交表单后,将会自动跳转到新页面,因此即使用户重新加载或者后退到上一页,也不会重复提交表单。
<form action="submit.php" method="post">
<!-- 表单内容 -->
</form>
PRG模式是一种常用的表单重复提交解决方案,它包括以下几个步骤:
header('Location: ')
将用户重定向到一个新页面这样做的好处是,即使用户重新加载或者后退到上一页,也不会再次提交表单,因为表单数据已经在服务器端处理完毕了。
<?php
// 处理表单数据
$data = $_POST['data'];
// 将结果存储在session中
session_start();
$_SESSION['result'] = compute($data);
// 重定向到结果页面
header('Location: result.php');
<?php
// 从session中获取结果数据
session_start();
$result = $_SESSION['result'];
// 显示结果
echo $result;
Token验证是一种比较安全的防止表单重复提交的方式,它会在表单中添加一个隐藏的 token
字段,并将其值存储在session中。当用户提交表单时,服务器端会检查 token
字段的值是否合法,如果合法则处理表单数据,否则不做任何处理。
<form method="post">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<!-- 表单内容 -->
</form>
<?php
// 生成随机Token值
function generate_token() {
return md5(uniqid(mt_rand(), true));
}
// 检查Token值是否合法
function validate_token() {
if(!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) {
die('Invalid token');
}
}
// 处理表单数据
function process_form() {
// 检查Token值是否合法
validate_token();
// 处理表单数据
// ...
}
session_start();
// 生成Token值并存储在session中
if(!isset($_SESSION['token'])) {
$_SESSION['token'] = generate_token();
}
// 处理表单数据
if($_SERVER['REQUEST_METHOD'] === 'POST') {
process_form();
}
以上是三种防止表单重新提交的方法,你可以根据具体场景选择合适的方法。在实际开发中,我们往往会结合多种方法来达到更好的效果。