Php 简明教程
PHP - Post-Redirect-Get (PRG)
在 PHP 中,PRG 代表“Post/Redirect/Get”。这是一种常用的技术,设计用于防止提交表单之后再次提交该表单。您可以在 PHP 中轻松实施此技术以避免重复提交表单。
通常,HTML 表单使用 POST 方法向服务器发送数据。服务器脚本获取数据以进行进一步处理,如在后端数据库中添加新记录或运行查询以获取数据。如果用户意外地刷新浏览器,则有可能再次重新提交相同的表单数据,可能导致数据完整性丢失。PHP 中的 PRG 方法帮助您避免这种陷阱。
Example
首先,我们考虑以下 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>
假设服务器正在运行,则将上述脚本放置在文档根文件夹中并在浏览器中访问。
填写数据并提交。浏览器会回显结果,然后重新渲染表单。现在,如果您尝试刷新浏览器页面,将会弹出一个警告,如下所示 −
如果您按 Continue ,则会再次发布相同数据。
可以使用以下图形理解问题 −
在 PHP 脚本中执行以下步骤以避免问题 −
-
HTML 表单之前的 PHP 脚本启动一个新会话。
-
检查表单是否已用 POST 方法提交。
-
如果是,请将表单数据存储到会话变量中
-
将浏览器重定向到结果页面。在我们的示例中,即为同一页面。使用 exit 命令停止此脚本,确保不会再执行更多代码。
-
如果 PHP 发现请求方法不是 POST,则会检查会话变量是否已设置。如果是,则会与刚复制的表单一同呈现。
-
现在,即使刷新了表单,您也已成功避免了重新提交的可能性。
Example
下面是使用 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 "First name: " . $_SESSION['fname'] . " " . "Last Name: " . $_SESSION['lname'] . "";
unset($_SESSION["fname"]); unset($_SESSION["lname"]);
}
?>
<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>