5

我正在使用 Querystring 重定向到另一个页面,比如说

header('location:abc.php?var=1');

我可以使用以下代码在查询字符串值的帮助下在重定向页面上显示一条消息,例如

if (isset ($_GET['var']))
{

    if ($_GET['var']==1) 
    {
        echo 'Done';
    }
}

但我的问题是,即使刷新页面,消息也会继续显示。因此,我希望在页面刷新时删除消息,即刷新时 URL 中不应存在值或查询字符串。

提前致谢。

4

6 回答 6

8

您不能“在刷新时删除查询参数”。“刷新”意味着浏览器再次请求相同的 URL,刷新时不会触发任何特定事件,可以让您将其与常规页面请求区分开来。

因此,摆脱查询参数的唯一选择是在显示消息后重定向到不同的 URL。比如说,使用 Javascript 您在 10 秒左右后重定向到不同的页面。虽然这显着改变了用户体验,但并没有真正解决问题。

选项二是将消息保存在服务器端会话中并显示一次。例如,类似:

if (isset($_SESSION['message'])) {
    echo $_SESSION['message'];
    unset($_SESSION['message']);
}

虽然这可能会导致与并行请求的混淆,但几乎可以忽略不计。

选项三将是两者的结合:您将消息保存在会话中并使用一些唯一令牌,然后在 URL 中传递该令牌,然后显示一次消息。例如:

if (isset($_GET['message'], $_SESSION['messages'][$_GET['message']])) {
    echo $_SESSION['messages'][$_GET['message']];
    unset($_SESSION['messages'][$_GET['message']]);
}
于 2013-04-29T09:43:11.990 回答
4

最好改用会话

将值分配给会话变量

$_SESSION['whatever'] = 1;

在下一页上,使用它并稍后取消设置

if(isset($_SESSION['whatever']) && $_SESSION['whatever'] == 1) {
  //Do whatever you want to do here

  unset($_SESSION['whatever']); //And at the end you can unset the var
}

这将是一个更安全的选择,因为它可以让您免于清理 get 值,并且该值将对用户隐藏

于 2013-04-29T09:40:11.680 回答
2

有一个优雅的 JavaScript 解决方案。如果浏览器支持 history.replaceState ( http://caniuse.com/#feat=history ) 你可以简单地调用 window.history.replaceState( Object , Title , URL ) 并用干净的 URL 替换浏览器历史记录中的当前条目. 查询字符串将不再用于刷新或后退/上一个按钮。

于 2016-06-16T11:55:00.913 回答
1

当消息提示要求一个不存在的会话时。如果为假,则显示消息,如果为真,则不执行任何操作。session_start(); 仅在之前没有 startet 的情况下才需要。

session_start();
if ($_GET['var']==1 && !isset($_SESSION['message_shown'])) 
{
    $_SESSION['message_shown'] = 1;
    echo 'Done';
}
于 2013-04-29T09:44:51.437 回答
0

试试这种方式[使用会话]

<?php
//abc.php
session_start();
if (isset ($_GET['var']))
{
if ($_GET['var']==1) 
{
if(isset($_SESSION['views']))
{
//$_SESSION['views']=1;
}
else
{
    echo 'Done';
   $_SESSION['views']=1;
}
}

}
?>
于 2013-04-29T09:41:52.203 回答
0

认为这个问题的意思是这样的吗?

 $uri_req = trim($_SERVER['REQUEST_URI']);
    if(!empty($_SERVER['REQUEST_URI'])){
      $new_uri_req = str_replace('?avar=1', '?', $uri_req);
      $new_uri_req = str_replace('&avar=1', '', $new_uri_req);
      $pos = strpos($new_uri_req, '?&');
      if ($pos !== false) {
       $new_uri_req = str_replace('?&', '?', $new_uri_req);
      } 
     }

if( strrchr($new_uri_req, "?") == '?' ){
 $new_uri_req = substr($new_uri_req, 0, -1);
}

 
     echo $new_uri_req; exit;

然后,您可以使用 url 来重定向而不使用 vars。你也可以在 js 中做同样的事情。

str_replace() 可以传递要替换的值数组。可以统一对 str_replace() 的前两个调用,并填充任意数量的需要删除的变量。另请注意,使用 preg_replace() 您可以使用正则表达式来管理任何传递的值可能会更改的 var。干杯!

于 2020-06-23T14:37:43.740 回答