PHP检测是否使用PHP_SELF重新加载页面

时间:2010-05-19 22:04:19

标签: php self referer

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

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

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

btw我也在使用:

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

当用户单击后退按钮时,避免恼人的重发数据消息。它是否正确?

4 个答案:

答案 0 :(得分:3)

如果您想确保提交表单,可以将变量存储在session中:

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']来检测访问者来自哪个页面。

答案 1 :(得分:2)

你可以这样做......

一个。重定向到自己,但有一条额外的信息 - “?updated = true”(如果PHP_SELF已包含查询字符串,则**&amp; ** updated = true)

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

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

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

...是的,您的重定向是防止重新发布的有效方法

答案 2 :(得分:1)

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

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

通过这种方式,浏览器上的“后退”按钮可以为用户提供直观的行为,而不会显示那些恼人的消息。

另外,从技术上讲,$ _SERVER“referer”值可以被欺骗,所以你不应该总是依赖它。

答案 3 :(得分:0)

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

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

为什么不这样做?