📌  相关文章
📜  php 防止表单重新提交 - Html (1)

📅  最后修改于: 2023-12-03 15:18:32.503000             🧑  作者: Mango

PHP防止表单重新提交 - HTML

表单重新提交是指用户在提交表单后,再次刷新页面或者后退到上一页并重新提交表单。这种行为可能会导致重复提交表单,造成数据错误或者其他问题。为了避免这种情况发生,我们需要在代码中添加一些措施来防止表单重新提交。

方法一:将表单提交到新页面

最简单的方法是将表单提交到一个新页面上。这可以通过设置表单的 action 属性实现。当用户提交表单后,将会自动跳转到新页面,因此即使用户重新加载或者后退到上一页,也不会重复提交表单。

<form action="submit.php" method="post">
  <!-- 表单内容 -->
</form>
方法二:使用PRG(Post-Redirect-Get)模式

PRG模式是一种常用的表单重复提交解决方案,它包括以下几个步骤:

  1. 用户提交表单
  2. 服务器处理数据,并将结果存储在session中
  3. 服务器使用 header('Location: ') 将用户重定向到一个新页面
  4. 新页面从session中获取数据,显示结果

这样做的好处是,即使用户重新加载或者后退到上一页,也不会再次提交表单,因为表单数据已经在服务器端处理完毕了。

<?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验证是一种比较安全的防止表单重复提交的方式,它会在表单中添加一个隐藏的 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();
}

以上是三种防止表单重新提交的方法,你可以根据具体场景选择合适的方法。在实际开发中,我们往往会结合多种方法来达到更好的效果。