【发布时间】:2015-05-20 10:30:09
【问题描述】:
一旦页面中的数据被提交,我需要能够阻止页面发布。例如我可以有这个表格:
<form action='#' method='post'>
<input type='text' name='name' />
<input type='submit' name='submit' />
</form>
然后像这样抓住帖子:
<?php
if (isset($_POST['submit'])) {
echo "Hello " . $_POST['name'];
}
?>
但是当页面刷新时,它会一次又一次地执行相同的操作,直到用户离开页面或在页面上进行完全刷新。这给我带来了一个巨大的问题,因为一旦完成,我必须能够阻止帖子进行预演。
我曾尝试使用元标记 (<meta http-equiv="refresh" content="5">) 来刷新页面,但这导致了一个问题,因为每隔几秒它就会这样做并且页面数据丢失,我试图取消设置 post 变量 (@ 987654324@ 和 unset($_POST);),但这不起作用,我不能使用 header("Location: ..."),因为我正在使用 WordPress,因此标题总是由系统发送。
所以我向我们的社区提出这个问题:如何阻止帖子重新提交数据?
编辑
我现在在做什么:
<?php
if (!isset($_SESSION)) {
session_start();
}
$token = rand();
if ($_POST) {
if (isset($_SERVER['token'])) {
if($_POST['token'] == $_SESSION['token']){
$continue = FALSE;
}
else {
$continue = TRUE;
}
}
else {
$_SERVER['token'] = $_POST['token'];
$continue = TRUE;
}
if ($continue === TRUE) {
if (isset($_POST['update'])) {
//Do update code
}
if (isset($_POST['win'])) {
//Do win code
}
if (isset($_POST['credit'])) {
//do credit code
}
}
}
表格:
<form method="post" action="#">
<select name="select">
<option value="false" <? if ($results->data[$i]['marked'] == "false") { echo "selected"; } ?>>No Attention</option>
<option value="true" <? if ($results->data[$i]['marked'] == "true") { echo "selected"; } ?>>Needs attention</option>
</select>
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="hidden" name="betid" value="<? echo $results->data[$i]['bet_id']; ?>" />
<input name="update" id="" class="btn btn-default" value="Update" type="submit">
</form>
【问题讨论】:
-
是的,本来只是一个管道,我的错
-
您可以在提交之前生成一个令牌,然后将该令牌与表单一起发送,然后在提交表单后将令牌存储到会话中,然后检查会话令牌是否等于 POST /get token,如果是,则不执行提交,如果不是则执行。 (如果用户想提交新数据,表单中会生成一个新的token,但是刷新会保留旧的token。)
-
@Epodax,
if (isset($_POST['submit'])) { if (!isset($_SESSION['token'])) { /*do action*/ $_SESSION['token'] = new_token(); } }? -
我会发布一个'答案,它会更容易解释。
-
或者
$posttoken = new_token();只在页面生命周期内持续?