如何防止用户重新发送表单数据?

Cyc*_*one 5 php forms

我有一个POST表单,它确实将数据发送到同一个文件,如果使用点击浏览器中的后退按钮,他可以轻松地重新发送数据,它仍然会被读取.

有没有办法避免这种行为?

Kai*_*ing 3

Levi 发送的链接将为您解答。但如果你想要替代方案,我是这样做的......

用户向某个班级发帖,例如您的班级。相同的文件。在课程开始时,我进行后期处理。对于这个例子,我将使它变得非常简单......

<?php
session_start();

//set form vars ahead of time so you can pre-populate the value attr on post
$form = array(
    'name' => '',
    'email' => ''
);

if(!empty($_POST))
{
    //do some kind of validation...
    $errors = array();
    if(trim($_POST['name']) == '')
        $errors[] = 'Please enter your name';

    if(empty($errors))
    {
        $_SESSION['message'] = 'Thank you for participating';
        header('location: /form.php'); // same file
        exit;
    }
    else
    {
        // set the form vars to the post vars so you don't lose the user's input
        $form['name'] = $_POST['name'];
        $form['email'] = $_POST['email'];

        $message = '<span style="color:red">';
        foreach($errors AS $error)
        {
            $message .= $error."<br />";
        }
        $message .= '</span>';
        $_SESSION['message'] = $message;
    }
}

if(isset($_SESSION['message']))
{
    echo $_SESSION['message'];
    unset($_SESSION['message']);
}
?>
<form id="some_form" action="" method="post">
    <fieldset>
        <label for="name">Name</label> <input type="text" name="name" value="<?php echo $form['name']; ?>" />
        <br /><br />
        <label for="email">Email</label> <input type="text" name="email" value="<?php echo $form['email']; ?>" />
        <br /><br />
        <input type="submit" name="submit" value="Submit" />
    </fieldset>
</form>
Run Code Online (Sandbox Code Playgroud)

现在您可以一遍又一遍地刷新,而不必提交表单两次。

编辑以显示进一步的示例。显然,您的验证和错误处理应该比这更复杂一些,但这应该会让您朝着正确的方向前进。