2

我有一个使用更新数据重新加载页面的表单:

<form name="form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    ...
    <input type="submit" name="Submit" value="Update data">
</form>

当页面更新时,我想显示一条消息“数据已更新”。我相信Referer有类似的东西,但不记得了。

顺便说一句,我也在使用:

if (isset($_POST['Submit'])) {
    // prevent resending data
    header("Location: " . $_SERVER['PHP_SELF']);
}

避免用户单击后退按钮时烦人的重新发送数据消息。这个对吗?

4

4 回答 4

4

如果您想绝对确定表单已提交,您可以在会话中存储一个变量:

session_start();      // at top of page
...
if (isset($_POST['Submit'])) {
    $_SESSION['form_submitted'] = true;
    ...
    // prevent resending data
    header("Location: " . $_SERVER['PHP_SELF']);
}
elseif ($_SESSION['form_submitted'])
{
    ...
}

不太可靠但也可能$_SERVER['HTTP_REFERER']用于检测访问者来自哪个页面。

于 2010-05-19T22:09:56.077 回答
2

你可以做这样的事情......

一个。重定向到自我,但带有额外的信息 - "?updated=true"(如果 PHP_SELF 已经包含查询字符串,则为 **&**updated=true)

if (isset($_POST['Submit'])) {
    // prevent resending data
    header("Location: " . $_SERVER['PHP_SELF'] . '?updated=true');
}

湾。根据这些额外信息,显示文本。

if (isset($_GET['updated'])) {
    echo "data updated";
}

...是的,您的重定向是防止重新提交的有效方法

于 2010-05-19T22:12:53.697 回答
1

防止“重新发送数据”消息的一种普遍接受的方法是使用Post-Redirect-Get模式。

理想情况下,您不应该使用同一页面来显示结果并处理表单。我建议将“数据更新”移动到表单验证通过后重定向到的单独页面。

这样,浏览器上的“后退”按钮就可以直观地为用户表现,而不会出现那些烦人的消息。

此外,从技术上讲,$_SERVER “referer”值可能会被欺骗,因此您不应总是依赖它。

于 2010-05-19T22:09:47.307 回答
0

你几乎可以使用你正在使用的东西:

if (isset($_POST['submit'])) {
    echo "data submitted";
}

为什么不这样做?

于 2010-05-19T22:05:34.167 回答