表单提交后取消设置后变量

时间:2012-08-01 18:16:21

标签: php form-submit

有没有办法做到以上几点?基本上,如果有人在提交表单一次后按下刷新,我不希望再次提交表单。在这种情况下,浏览器会询问,您是否要再次提交表单。在这种情况下unset($_POST['username'])会有任何帮助吗?

11 个答案:

答案 0 :(得分:10)

post / redirect / get是一个很好的选择,因为一些海报已经提到过。

我能想到的另一种方法是在dostuff.php页面中设置一个会话,以表明发布已经完成。每次检查此会话var,以查看是否因页面刷新而再次加载页面。

<?php
    session_start();
    if(isset($_SESSION['indicator'])) 
    {
        /*
        dont do anything because session indicator says 
        that the processing was already done..

        you might want to redirect to a new url here..          
        */
    }   
    else
    {

        /*
        first set session indicator so that subsequent 
        process requests will be ignored
        */
        $_SESSION['indicator'] = "processed"; 

        //process the request here..
    }
    ?>

在您重定向到的页面中,取消设置会话var,以便可以重新重新提交表单,使其成为新的后期操作。这将允许新的表单帖子,但会因页面刷新而阻止后期操作

答案 1 :(得分:3)

使用中间页面执行操作,然后重定向。

例如:

mypage.php - &gt;带有

形式的页面

dostuff.php - &gt;接收表单数据并进行操作,然后重定向到任何其他页面。

要进行重定向:
将此行放在“dostuff.php”的顶部:header("Location: mypage.php");

答案 2 :(得分:2)

您面临的问题可以(并且应该)通过Post/Redirect/Get来解决。在PHP端取消设置_POST将无效,因为问题是它是一个单独的请求。

您还必须双击提交按钮。您可以在客户端通过在单击按钮后禁用表单提交,或者在表单中放置随机令牌并将该令牌存储在会话中来解决此问题。该令牌仅被接受一次(会话记录该令牌是否已被发布)。

答案 3 :(得分:2)

使用此代码

    if(isset($_POST)){
      header('location:'.$_SERVER['PHP_SELF']);
      die();
     }

答案 4 :(得分:1)

这是一个很好的方法,用于阻止用户两次提交相同的数据,这也会阻止页面在重新加载时向数据库添加相同的记录。

// First IF
if ($_SESSION['dup_comment_body'] == $_POST['comment_body']) { 
    echo 'You already entered that.';
} else {
    // Second IF
    if ($_POST['comment_body']) {

        // Run your query here

    $_SESSION['dup_comment_body'] = $_POST['comment_body']; 
    header('location:'.$_SERVER['REQUEST_URI'].'');
    }
} 

第一次IF检查$_POST是否等于他们输入的最后一件事($_SESSION)。如果它不相同,则运行下一个IF来测试$_POST变量是否为空。在最后IF的底部,它将$_SESSION['dup_comment_body']设置为等于$_POST。因此,下次第一次IF运行且$_POST相同时,他们会收到消息“您已输入该内容。”。希望这有帮助!

答案 5 :(得分:0)

如果您的表单将要更新数据库,则仅当记录不存在时才可以更新或插入。只需先执行一条select语句。这样可以防止由于刷新而重复记录。

答案 6 :(得分:0)

如果要将此表单的内容插入数据库,只需使用php / sql SELECT语句来检查“用户名”是否已提交。如果是,则抛出错误。像这样:

//Database Values: servername, dbname, username and password;
//Also set ($_POST['username']) = $username or anything you like; 
$usererror = ""; //Will be filled later.
try { 
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt1 = $conn->prepare("SELECT * FROM yourdb WHERE username=:username");
$stmt1->bindParam(':email', $email);
$stmt1->execute();
$stmt1->fetch();

$querycheck = $stmt1->rowCount();
if ($querycheck >= 1) {
$usererror = "User already exists.";
}
}
catch(PDOException $e) {
// roll back the transaction if something failed
$conn->rollback();
echo "Critical Error. Contact admin immediately.";
error_log("Error: " . $e->getMessage(), 0); //logs connection errors instead of echoing the errors (for security reasons.)
}
$conn = null;

然后您现在只能插入没有错误的表格:

If (empty($usererror)) {
//insert command 
}

注意,我使用了准备好的语句,因为在许多文章中,据说这是使用php + sql在数据库上进行操作的最安全的方法。如果您确实没有安全问题,也可以使用常规方法,这样也可以节省更多代码行。

还要注意 $ querycheck> = 1 ,即使用户刷新2,000次,单击“后退”按钮并再次提交等,确保1次插入且不超过1次也是非常重要的。错误令我束手无策并使我发疯了好几天的原因是使用 $ querycheck> 1 而不是 $ querycheck> = 1 ,这样,我的表单在提交“已经存在”错误。最后,我已经能够修复它。希望这对以后会问这个问题的人有所帮助。

答案 7 :(得分:0)

您可以在处理表单数据后重置 $_POST 数组,例如如下代码

<?php
if( isset($_POST['submit']))
{
//do some processing related to form;
//after done.....
$_POST = array(); //this declares post as empty array 
//which is global variable anyways.
}
?>

或者第二种方式是使用隐藏表单的东西....

<?php
if( isset($_POST['submit']))
{
//do some processing related to form;

//create a form with hidden field
?>
<form method="post" name="myform" action="actionpage">
<input type="hidden" name="somename" value="">
</form>
<?php
echo "<script> document.forms['myform'].submit();</script>";
}
?>

这基本上会提交带有 1 个空值字段的表单,我不知道这是否是最佳的,但它满足了这里的需要。

答案 8 :(得分:-1)

您需要使用POST/REDIRECT/GET pattern

  

Post / Redirect / Get(PRG)是一种Web开发设计模式,可以防止一些重复的表单提交,为用户代理(用户)创建更直观的界面。 PRG以可预测的方式支持书签和刷新按钮,不会创建重复的表单提交。

     

当通过HTTP POST请求将Web表单提交给服务器时,尝试刷新某些用户代理中的服务器响应的Web用户可能会导致重新提交原始POST请求的内容,从而可能导致意外结果,例如重复的网络购买。

     

为避免此问题,许多Web开发人员使用PRG模式 - 而不是直接返回网页,POST操作返回重定向命令。 HTTP 1.1规范引入了HTTP 303(“请参阅其他”)响应代码,以确保在这种情况下,Web用户的浏览器可以安全地刷新服务器响应,而不会导致重新提交初始POST请求。但是,目前使用的最常见的商业应用程序(新旧相似)在这些情况下仍然会继续发出HTTP 302(“Found”)响应。

以下是PHP中的一个示例:

header('Location: /yourpage.php', true, 303);
exit;

答案 9 :(得分:-1)

我的解决方法是在设置post变量时进行元刷新,$ _POST在刷新后不跟随它。

<head>
<?php
  if (isset($_POST['Task'])){
  echo' <meta http-equiv="refresh" content="0; url=./ThisFile.php">';
  }
  ?>
</head>

答案 10 :(得分:-2)

相反,你可以使用像Recaptcha这样的验证码,它不允许在不进行验证码的情况下提交帖子。这就是我使用的,它完美无缺。