微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

POST / REDIRECT / GET无法在PHP联系人表单中工作

如何解决POST / REDIRECT / GET无法在PHP联系人表单中工作

我正在尝试使用一个复选框输入和服务器端验证来配置基本的联系POST表单。这意味着该表单必须提交给自己,因此是一个自我服务的联系表单。我遇到的问题是刷新页面时,再次提交了表单。

我正在使用会话数据来存储表单验证,因为此表单是用户必须勾选并确认才能进入页面的初始弹出窗口。该页面上有两个联系表单,但我正在显示一个联系表单,并且我认为两者的实现应相同(如果我错了,请纠正我)。一旦用户勾选了该框并提交了表单,弹出窗口就会隐藏起来,允许用户查看页面

解决这个问题,我相信 POST / REDIRECT / GET 设计模式应该可以防止这种情况,但是,我认为自己的实现方式不正确,也不知道我的问题出在哪里代码

下面的index.PHP代码

<!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>

form_process.PHP下面的代码

<?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 举报,一经查实,本站将立刻删除。