我有一个向SQL表提交文本的简单表单。问题在于,在用户提交文本之后,他们可以刷新页面并再次提交数据,而无需再次填写表单。我可以在文本提交后将用户重定向到另一个页面,但我希望用户停留在同一页面上。

我记得我读过一些关于给每个用户一个唯一的会话id,并将其与另一个值进行比较,这解决了我所遇到的问题,但我忘记了它在哪里。


当前回答

我找到了下一个变通办法。您可以通过操作历史对象在处理POST请求后转义重定向。

你有一个HTML表单

<form method=POST action='/process.php'>
 <input type=submit value=OK>
</form>

当你在你的服务器上处理这个表单时,你不是重定向用户到/the/result/页面,而是像这样设置Location头:

$cat process.php
<?php 
     process POST data here
     ... 
     header('Location: /the/result/page');
     exit();
?>

处理post数据后,呈现小的<脚本>和result/ the/result/page

<?php 
     process POST data here
     render the <script>         // see below
     render `/the/result/page`   // OK
?>

你应该渲染的<脚本>:

<script>
    window.onload = function() {
        history.replaceState("", "", "/the/result/page");
    }
</script>

结果是:

如你所见,表单数据被post到process.php脚本。 这个脚本处理post数据并立即渲染/the/result/page:

没有重定向 当你刷新页面时没有rePOST数据(F5) 当你通过浏览器历史导航到上一页/下一页时,没有rePOST

UPD

作为另一个解决方案,我要求Mozilla FireFox团队允许用户设置NextPage头,它将像Location头一样工作,使post/redirect/get模式过时。

简而言之。当服务器处理表单POST数据成功时:

设置NextPage头而不是位置 呈现POST表单数据处理的结果,就像在POST /redirect/ GET模式中呈现GET请求一样

浏览器依次看到NextPage头:

调整窗口。位置与NextPage值 当用户刷新页面时,浏览器将协商GET请求NextPage而不是rePOST表单数据

我认为这将是极好的,如果实施,不是吗?=)

其他回答

为什么不直接使用$_POST['submit']变量作为逻辑语句来保存表单中的任何内容呢?你总是可以重定向到相同的页面(以防它们刷新,当它们在浏览器中点击返回时,submit post变量将不再被设置。只要确保你的提交按钮有一个名称和id提交。

插入到数据库后,调用unset()方法清除数据。

设置($ _POST);

为防止刷新数据插入,请在记录插入后将页面重定向到同一页或不同页。

头(地点:。$ _SERVER [' PHP_SELF ']);

使用Keverw answer的Post/Redirect/Get模式是个好主意。然而,你不能留在你的页面上(我认为这是你所要求的?)此外,它有时可能会失败:

如果web用户在首次提交完成之前刷新 由于服务器延迟,导致重复的HTTP POST请求在 某些用户代理。

另一个选择是存储在会话中,如果文本应该像这样写入SQL数据库:

if($_SERVER['REQUEST_METHOD'] != 'POST')
{
  $_SESSION['writeSQL'] = true;
}
else
{
  if(isset($_SESSION['writeSQL']) && $_SESSION['writeSQL'])
  {
    $_SESSION['writeSQL'] = false;

    /* save $_POST values into SQL */
  }
}

$_POST['submit']变量在页面初始加载时不存在,并且只有在以下条件为真时才可以运行curl。

if($_POST['submit'] == "submit"){

// This is where you run the Curl code and display the output
  $curl = curl_init();



//clear $post variables after posting
$_POST = array();

}

一个非常可靠的方法是在post中实现一个唯一的ID,并将其缓存到

<input type='hidden' name='post_id' value='".createPassword(64)."'>

然后在你的代码中这样做:

if( ($_SESSION['post_id'] != $_POST['post_id']) )
{
    $_SESSION['post_id'] = $_POST['post_id'];
    //do post stuff
} else {
    //normal display
}

function createPassword($length)
{
    $chars = "abcdefghijkmnopqrstuvwxyz023456789";
    srand((double)microtime()*1000000);
    $i = 0;
    $pass = '' ;

    while ($i <= ($length - 1)) {
        $num = rand() % 33;
        $tmp = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
    }
    return $pass;
}