在 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 脚本中采取了以下步骤来避免此问题 -
- 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>