如何解决POST / REDIRECT / GET无法在PHP联系人表单中工作
我正在尝试使用一个复选框输入和服务器端验证来配置基本的联系POST表单。这意味着该表单必须提交给自己,因此是一个自我服务的联系表单。我遇到的问题是刷新页面时,再次提交了表单。
我正在使用会话数据来存储表单验证,因为此表单是用户必须勾选并确认才能进入页面的初始弹出窗口。该页面上有两个联系表单,但我正在显示一个联系表单,并且我认为两者的实现应相同(如果我错了,请纠正我)。一旦用户勾选了该框并提交了表单,弹出窗口就会隐藏起来,允许用户查看页面。
为解决这个问题,我相信 POST / REDIRECT / GET 设计模式应该可以防止这种情况,但是,我认为自己的实现方式不正确,也不知道我的问题出在哪里代码。
<!DOCTYPE html>
<html lang="en">
<?PHP
session_start();
include('form_process.PHP');
?>
<head>
<Meta charset="UTF-8" />
<link rel="stylesheet" href="assets/css/main.min.css" />
</head>
<body>
<section id="selfCertOverlay" <?=$_SESSION['closeSelfCert']?>>
<div class="blurOverlay">
<form id="selfCert" method="post">
<label for="self_cert">I have read and confirm the statement.
<input type="checkBox" name="self_cert" id="self_cert">
<span id="checkmark" class="<?= ($_SESSION['self_cert_checkBox_error']) ? 'inputError' : ''; ?>"></span>
<span class="error"><?= (isset($_SESSION["self_cert_error"])) ? $_SESSION["self_cert_error"] : ''; ?></span>
</label>
<input type="submit" name="submit_self_cert" value="Confirm & Proceed">
</form>
</div>
</section>
</body>
</html>
<?PHP
$_SESSION["self_cert_error"] = "";
$_SESSION["self_cert_checkBox_error"] = false;
if (!isset($_POST["self_cert"])) {
$_SESSION["self_cert_error"] = "Please read and accept the statement to proceed";
$_SESSION["self_cert_checkBox_error"] = true;
} else {
unset($_SESSION["self_cert_error"]);
$message_body = '';
unset($_POST['submit']);
foreach ($_POST as $key => $value) {
$keyOutput = str_replace('_',' ',$key);
$keyOutput = ucwords($keyOutput);
$message_body .= "$keyOutput: $value\n";
}
$to = 'example@mailprovider.com';
$subject = 'Email Subject';
if (mail($to,$subject,$message_body)){
$_SESSION["closeSelfCert"] = 'style="display: none;"';
// Redirect to itself.
header( "Location: {$_SERVER['REQUEST_URI']}",true,303 );
return;
}
}
?>
解决方法
浏览器上的刷新按钮重新发送客户端发送的最后一个HTTP请求。这就是为什么刷新页面时,它将重新提交表单。
解决此问题的唯一方法是使用POST / REDIRECT方法。
要设置POST / REDIRECT方法,请使用中间页进行操作,然后再重定向到原始表单。
例如: index.php->带有表单的页面-确保表单已声明action =“ form_process.php”,以便将数据发布到form_process.php脚本
form_process.php->接收表单数据并执行您的操作,然后最后重定向回index.php页面。
因此您的最终代码应类似于以下内容;
index.php
我已删除顶部的include('form_process.php');
我已将action="form_process.php"
添加到<form>
标签
<!DOCTYPE html>
<html lang="en">
<?php
session_start();
?>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="assets/css/main.min.css" />
</head>
<body>
<section id="selfCertOverlay" <?=$_SESSION['closeSelfCert']?>>
<div class="blurOverlay">
<form id="selfCert" method="post" action="form_process.php">
<label for="self_cert">I have read and confirm the statement.
<input type="checkbox" name="self_cert" id="self_cert">
<span id="checkmark" class="<?= ($_SESSION['self_cert_checkbox_error']) ? 'inputError' : ''; ?>"></span>
<span class="error"><?= (isset($_SESSION["self_cert_error"])) ? $_SESSION["self_cert_error"] : ''; ?></span>
</label>
<input type="submit" name="submit_self_cert" value="Confirm & Proceed">
</form>
</div>
</section>
</body>
</html>
form_process.php
我在顶部添加了session_start();
,以便您可以访问$_SESSION
数据
我已在您的第一条IF语句中添加了header( "Location: index.php",true,303 );
我已更改了您发送电子邮件后发生的header()
路由,因此该路由重定向回index.php
<?php
session_start();
$_SESSION["self_cert_error"] = "";
$_SESSION["self_cert_checkbox_error"] = false;
if (!isset($_POST["self_cert"])) {
$_SESSION["self_cert_error"] = "Please read and accept the statement to proceed";
$_SESSION["self_cert_checkbox_error"] = true;
header( "Location: index.php",303 );
exit;
} else {
unset($_SESSION["self_cert_error"]);
$message_body = '';
unset($_POST['submit']);
foreach ($_POST as $key => $value) {
$keyOutput = str_replace('_',' ',$key);
$keyOutput = ucwords($keyOutput);
$message_body .= "$keyOutput: $value\n";
}
$to = 'example@mailprovider.com';
$subject = 'Email Subject';
if (mail($to,$subject,$message_body)){
$_SESSION["closeSelfCert"] = 'style="display: none;"';
// Redirect back to the form page.
header( "Location: index.php",303 );
exit;
}
}
?>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。