繁体   English   中英

POST/REDIRECT/GET 在 PHP 联系表单中不起作用

[英]POST/REDIRECT/GET not working in PHP contact form

我正在尝试使用一个复选框输入和服务器端验证配置一个基本的联系人 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",因此它将数据 POST 到 form_process.php 脚本

form_process.php --> 接收表单数据并执行您的操作,最后重定向回 index.php 页面。

所以你的最终代码应该如下所示;

索引.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数据

我添加了header( "Location: index.php", true, 303 ); 在你的第一个 IF 语句中

我已经更改了在您发送电子邮件后发生的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", true, 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", true, 303 );
        exit;
    }
}
?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM