PHP - 重定向后获取 (PRG)


在 PHP 中,PRG 代表“Post/Redirect/Get”。这是一种常用的技术,旨在防止在提交表单后重新提交表单。您可以轻松地在 PHP 中实现此技术,以避免重复的表单提交。

通常,HTML 表单使用 POST 方法将数据发送到服务器。服务器脚本获取数据以进行进一步处理,例如在后端数据库中添加新记录,或运行查询以获取数据。

如果用户意外刷新了浏览器,则可能会再次重新提交相同的表单数据,这可能会导致数据完整性丢失。PHP 中的 PRG 方法可以帮助您避免这个陷阱。

例子

首先,让我们考虑以下 PHP 脚本,它呈现一个简单的 HTML 表单,并使用 POST 方法将其提交回自身。当用户填写数据并提交时,后端脚本会获取数据,呈现结果,然后返回以再次显示空白表单。


<?php
   if (isset($_POST["submit"])) {
      if ($_SERVER["REQUEST_METHOD"] == "POST")
         echo "First name: " . $_REQUEST['first_name'] . " " . "Last Name: " . $_REQUEST['last_name'] . "";
   }
?>

<html>
<body>
   <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
      First Name: <input type="text" name="first_name">  <br/>
      Last Name: <input type="text" name="last_name" />
      <button type="submit" name="submit">Submit</button>
   </form>
</body>
</html>

假设服务器正在运行,则上述脚本将放置在文档根文件夹中,并在浏览器中进行访问。

填写数据并提交。浏览器将回显结果,并重新呈现表单。现在,如果您尝试刷新浏览器页面,则会弹出一条警告,如下所示 -

PHP PRG 1

如果按 继续 按钮,则会再次发布相同的数据。

问题可以用下图来理解——

PHP PRG 2

在 PHP 脚本中采取了以下步骤来避免此问题 -

  • HTML 表单启动新会话之前的 PHP 脚本。
  • 检查表单是否已使用 POST 方法提交。
  • 如果是这样,请将表单数据存储在会话变量中
  • 将浏览器重定向到结果页面。在我们的例子中,它是同一个页面。使用 exit 命令终止此脚本,以确保不再执行任何代码。
  • 如果 PHP 发现 REQUEST 方法不是 POST,它会检查是否设置了会话变量。如果是这样,它们将与 form 的新副本一起呈现。
  • 现在,即使表单已刷新,您也已成功避免了重新提交的可能性。

例子

这是使用 PRG 技术的 PHP 代码 -


<?php
   session_start();
   if (isset($_POST["submit"])) {
      $_SESSION['fname'] = $_POST['first_name'];
      $_SESSION['lname'] = $_POST['last_name']; 
      header("Location: hello.php");
      exit;
   }
   if (isset($_SESSION["fname"])) {
      echo "名字: " . $_SESSION['fname'] . " " . "姓: " . $_SESSION['lname'] . "";
      unset($_SESSION["fname"]); unset($_SESSION["lname"]);
   }
?>

<html>
<body>
   <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
      名字: <input type="text" name="first_name">  <br />
      姓: <input type="text" name="last_name" />
      <button type="submit" name="submit">提交</button>
   </form>
</body>
</html>