【问题标题】:PHP detect if page is reloaded with PHP_SELFPHP 检测页面是否使用 PHP_SELF 重新加载
【发布时间】:2010-05-20 06:15:26
【问题描述】:

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

<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']);
}

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

【问题讨论】:

  • 您不需要在表单上设置 action 属性。表单默认提交给自己。
  • 所以
    会做吗?甜!
  • 是的。但是,如果您使用的是 HTML4 或 XHTML 文档类型,并且希望您的 HTML 进行验证,则需要保留该属性。action="" 可以。使用 HTML5 文档类型,您可以忽略它。

标签: php self referer


【解决方案1】:

如果您想绝对确定表单已提交,您可以在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'] 来检测访问者来自哪个页面是不太可靠但也是可能的。

【讨论】:

  • 如果只是为了显示信息性消息,我会说检查引荐来源网址就足够了。
  • 谢谢杰罗恩。类似于: if (basename($_SERVER['HTTP_REFERER']) == basename($_SERVER['PHP_SELF'])) echo "data updated";现在会比吗?我不太关心安全性,因为此页面位于登录系统后面。
  • @FFish:应该这样做。但是请注意,如果人们可以单击指向同一页面的链接,他们也会收到该消息(例如单击“联系人”页面上的“联系人”)。
  • 正如 jeroen 所说,您只需要设置 $_SESSION['form_submitted'] = false;在 elseif 块内,以防止它在整个会话中保持设置。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 谢谢,但我已经有一个变量,例如:admin/photos-edit.php?ref=002140 并希望保持这种状态。
  • 好的,所以你可以添加 '&updated=true' 代替(和号代替问号)。你最终会得到 admin/photos-edit.php?ref=002140&updated=true
  • 是的,我知道,这是一个很好的解决方案,但我想像这样保持 url 干净。无论如何,谢谢
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

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

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

    为什么不这样做?

    【讨论】:

    • 因为他在那里进行重定向,并且需要在重定向后显示“数据更新”。
    • 哦,误会了。谢谢墨卡托,人们帮助的不仅仅是提出问题的人,这很好,SO 是一个很棒的社区。​​span>
    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2012-03-11
    • 2014-03-15
    • 2014-05-06
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多