【问题标题】:Getting Rid of Back Button Confirm Form Resubmission page [duplicate]摆脱后退按钮确认表单重新提交页面[重复]
【发布时间】:2014-11-09 13:08:35
【问题描述】:

我正在开发一个使用表单的 php 电子邮件程序,该表单需要重定向到我无权访问以添加代码的“谢谢”页面。用户输入通过一些简单的 preg_match 函数发送,以确保它匹配必要的格式。如果其中一项功能失败,则会回显一个 javascript 弹出窗口,让用户知道他们需要更改什么。如果成功,数据将存储在 SESSION 变量中,并传递到页面,在该页面中将数据添加到必要的 html 中,并作为简单的 html 电子邮件发送。然后 process.php 页面重定向到 results.php 清除会话,并将用户带到“谢谢”页面。

我的问题是,当用户输入错误数据然后更正并提交时,在到达“谢谢”页面后按下“返回”按钮会让我在返回之前获得这些“确认表单重新提交”页面之一表格。一旦它在第二次点击“返回”后真正返回到表单,旧的、坏的数据就会在表单中代替好数据。我想修复它,使“确认表单重新提交”页面永远不会出现,如果用户只点击一次后退按钮,他们就会返回到空白表单。我的html:

            <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
            <table id="form_table" style="280px; border:0px; padding: 0 0 5px 0; border-spacing: 0px;">
                <tr>
                    <td>
                        <span style="font-size: 12px;">*First name</span>
                    </td>
                </tr>
                <tr>
                    <td>
                        <input style="padding: 5px; font-size: 12px;" name="firstName" type="text" size="50" value="<?php if(isset($_POST['firstName'])) { echo htmlentities($_POST['firstName']); }?>" />
                    </td>
                </tr>
                <tr>
                    <td style="padding-top: 7px;">
                        <span style="font-size: 12px;">*Last name</span>
                    </td>
                </tr>
                <tr>
                    <td>
                        <input style="padding: 5px; font-size: 12px;" name="lastName" type="text" size="50" value="<?php if(isset($_POST['lastName'])) { echo htmlentities($_POST['lastName']); }?>" />
                    </td>
                </tr>
                <tr>
                    <td style="padding-top: 7px;">
                        <span style="font-size: 12px;">*Email</span>
                    </td>
                </tr>
                <tr>
                    <td>
                        <input style="padding: 5px; font-size: 12px;" name="emailAddy" type="text" size="50" value="<?php if(isset($_POST['emailAddy'])) { echo htmlentities($_POST['emailAddy']); }?>" />
                    </td>
                </tr>
                <tr>
                    <td style="padding-top: 7px;">
                        <span style="font-size: 12px;">Phone number</span>
                    </td>
                </tr>
                <tr>
                    <td>
                        <input style="padding: 5px; font-size: 12px;" name="phoneNumber" type="text" size="50" value="<?php if(isset($_POST['phoneNumber'])) { echo htmlentities($_POST['phoneNumber']); }?>" />
                    </td>
                </tr>
                <tr>
                    <td style="padding-top: 15px;">
                        <span style="font-size: 12px;">Tell us how we can help</span>
                    </td>
                </tr>
                <tr>
                    <td>
                        <input style="padding: 5px 5px 15px 5px; font-size: 12px;" name="howHelp" type="text" size="50" value="<?php if(isset($_POST['howHelp'])) { echo htmlentities($_POST['howHelp']); } ?>" />
                    </td>
                </tr>
            </table>
            <div style="width: inherit;">
                <input type="image"  id="saveform" src="http://www.fivemm.com/client/tristar/images/consult-btn.jpg" alt="Submit Question!" style="width: 100%; height: 96px; border: none;" />
            </div>
            <?php echo $msg_to_user ?>
        </form>

处理代码,位于同一页面底部:

<?php

if(isset($_POST['firstName'])) {

function died($error) {
    $error = 'So sorry, but it looks like there are some issues with your form.\\n\\n'.$error;
    echo '<script type="text/javascript"> alert("'.$error.'")</script>';
    die();
}

$error_message = "";
$email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
$string_exp = "/^[A-Za-z .'-]+$/";
$msg_exp = "/^$|^[A-Za-z ?!.'-:]+$/";

if(!preg_match($string_exp,$_POST['firstName'])) {
    $error_message .= 'The first name you entered contains invalid characters or is blank.\\n\\n';
}

if(!preg_match($string_exp,$_POST['lastName']) && strlen($_POST['lastName']) > 0) {
    $error_message .= 'The last name you entered contains invalid characters.\\n\\n';
}

if(!preg_match($email_exp,$_POST['emailAddy'])) {
    $error_message .= 'The email address you entered does not appear to be valid or is blank.\\n\\n';
}

if(strlen($error_message) > 0) {
    died($error_message);
}

function clean_string($string) {
    $bad = array("content-type","bcc:","to:","cc:","href");
    return str_replace($bad,"",$string);
}

$_SESSION['firstName'] = $_POST['firstName']; // required
$_SESSION['lastName'] = $_POST['lastName']; // required
$_SESSION['emailAddy'] = $_POST['emailAddy']; // required
$_SESSION['phoneNumber'] = htmlspecialchars(clean_string($_POST['phoneNumber'])); //  required
$_SESSION['howHelp'] = clean_string($_POST['howHelp']);

echo ("<SCRIPT LANGUAGE='JavaScript'>window.location.href='process.php';</SCRIPT>");
}
?>

process.php 页面:

<?php
session_start();
if(isset($_SESSION['firstName']) && isset($_SESSION['page1'])) {
    $_SESSION['page2']="2";
    $first_name = $_SESSION['firstName'];
    $last_name = $_SESSION['lastName'];
    $email_addy = $_SESSION['emailAddy'];
    $phone_number = $_SESSION['phoneNumber'];
    $how_help = $_SESSION['howHelp'];

    // EDIT THESE 2 LINES BELOW AS REQUIRED
    $email_to = 'someguy@domainname.com'; // use for testing
    $email_subject = "This Guy Wants To Contact You!"; // Enter intended message here

    $email_message = '<html>';
    $email_message .= '<head>';
    $email_message .= '</head>';
    $email_message .= '<body>';
    $email_message .= '<h3>You have a new email message!</h3>';
    $email_message .= '<table>';
    $email_message .= '<tr><td>Name</td><td>'.$first_name.' '.$last_name.'</td></tr>';
    $email_message .= '<tr><td>Email Address</td><td>'.$email_addy.'</td></tr>';
    $email_message .= '<tr><td>Phone Number</td><td>'.$phone_number.'</td></tr>';
    $email_message .= '<tr><td>How can we help?</td><td>'.$how_help.'</td></tr>';
    $email_message .= '</table>';
    $email_message .= '</body>';
    $email_message .= '</html>';

    // create email headers

    $headers = "From: ".$first_name." \r\n";
    $headers .= "Bcc: otherguy@otherdomain.com, otherdude@yetanotherdomain.com\r\n";
    $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
    $headers .= "\r\n";

//      $headers .= 'X-Mailer: PHP/' . phpversion();
    @mail($email_to, $email_subject, $email_message, $headers);
    header('Location: results.php');
}
?>

最后是 results.php 页面:

<?php 
session_start();
    if (isset($_SESSION['page2']))
    {
        session_destroy();
        header('Location: http://www.domainname.com/thank-you/');
    }
    else
    {
        header('Location: index.php');
    }
?>

【问题讨论】:

  • 你可以试试: if ( window.history.replaceState ) { window.history.replaceState( null, null, window.location.href ); } 在您正在弹出的页面顶部

标签: javascript php html forms


【解决方案1】:

简短:您无法将其关闭。

Long:你应该将表单的处理移到开头。

首先,您检查表单是否已提交,如果是,则处理数据。 另一方面,当没有提交表单时,您只需显示表单。

这里的想法是,当您在处理数据时发现错误时, 您可以显示错误消息并再次显示表单。 这里的好处是现在您可以填写表格中正确的部分 使用您获得的 $_POST 值。

类似这样的:

    ...
    <input type="text" name="username" value="<?php echo $_POST["username"]?>" />
    ... 

现在用户只需填写有错误的内容并重新提交。 如果它通过了,您继续您的电子邮件部分。

请注意,您应该在使用 $_POST 数组之前对其进行清理。 (看:stripslashes、trim、htmlspecialchars)

希望我说清楚了:)


抱歉,来晚了,所以我举了一个例子来说明我的意思: sample php code

【讨论】:

    【解决方案2】:

    好吧,我必须承认,代码有点奇怪。正如我所看到的,您在表单页面中有一个 PHP 部分,用于测试表单中的值。而已? 我建议在 Javascript 中执行 Rexp。使用它,您将拥有更简洁的代码:一个带有 JS 测试的表单,提交到流程页面。 在进程页面中,如果需要,您可以执行另一个测试,如果失败,请填写会话并返回表单(在这种情况下,您必须阅读会话)。

    可能重新提交前的确认来自页面自调用的事实。

    问候 彼得

    【讨论】:

    • 我使用 php 来测试表单中的值,因为有人告诉我,恶意用户很容易通过在浏览器中关闭 javascript 来使用经过 javascript 测试的表单输入。我的代码结构还有其他缺点吗?
    • 我认为有两种观点。第一个是来自“基本而酷的家伙”的人,所以只是想使用您的网站的人。第二个是“坏人”。主要问题是,与虚伪的“坏人”作斗争不能给“酷人”制造问题。事实上,你必须有 JS 测试才能立即帮助“酷哥”(所以在提交之前警告框)以避免他提交不良数据。如果在这种情况下,有人提交了不良数据,这意味着他可能是“坏人”之一。所以只要拒绝数据,回到之前的空白页面就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2011-01-09
    • 2017-12-13
    • 2015-11-16
    • 2011-03-30
    • 2018-10-15
    相关资源
    最近更新 更多