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

问题描述 投票:10回答:9

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

php form-submit
9个回答
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,以便可以重新重新提交表单,使其成为新的后期操作。这将允许新的表单发布,但会阻止页面刷新后的后期操作


3
投票

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

例如:

mypage.php - >带有表单的页面

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

要重定向: 把这一行放在“dostuff.php”的顶部:header("Location: mypage.php");


2
投票

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

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


2
投票

使用此代码

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

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相同时,他们将收到消息“你已经输入了那个。”。希望这可以帮助!


0
投票

如果您的表单将要更新数据库,则只有在记录不存在时才能更新或插入。只需先做一个选择声明。这将防止由于刷新而导致的重复记录。


-1
投票

我的解决方案是进行元刷新,如果设置了post变量,$ _POST在刷新后不遵循它。

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

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

-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.