在页面刷新时删除查询字符串值

时间:2013-04-29 09:36:44

标签: php

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

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

我可以使用以下代码在querystring值的帮助下在重定向页面上显示一条消息,比如说

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

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

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

提前致谢。

6 个答案:

答案 0 :(得分:5)

您无法“在刷新时删除查询参数”。 “刷新”表示浏览器再次请求相同的URL,没有特定的事件在刷新时触发,可以让您将其与常规页面请求区分开来。

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

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

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

这个可以引起并行请求的混淆,但几乎可以忽略不计。

选项三可以是两者的组合:使用某些唯一令牌在会话中保存消息,然后在URL中传递该令牌,然后显示消息一次。 E.g:

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

答案 1 :(得分:4)

更好地使用会话

将值分配给会话var

$_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
}

这将是一个更安全的选择,因为它将使您免于清理获取值,并且还将从用户隐藏值

答案 2 :(得分:1)

当消息提示要求不存在的会话时。如果为false,则显示消息,如果为true,则不执行任何操作。在session_start();如果以前没有一个人,那就只需要。

session_start();
if ($_GET['var']==1 && !isset($_SESSION['message_shown'])) 
{
    $_SESSION['message_shown'] = 1;
    echo 'Done';
}

答案 3 :(得分:1)

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

答案 4 :(得分: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;
}
}

}
?>

答案 5 :(得分: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;

您可以使用网址进行重定向,而无需使用var。您也可以在js中执行相同的操作。

str_replace()可以传递要替换的值数组。可以将对str_replace()的前两个调用统一,并填充需要删除的任意多个var。还要注意,使用preg_replace()可以使用regexp,它可以管理值可能会更改的任何传递的var。干杯!