2009-07-30 56 views
4

我有一个用PHP编写的网站,当用户收到错误时,我会将它们重定向到另一个页面(使用header(Location:...)),并将错误ID放在URL中我知道要显示哪个错误。

E.g.如果用户尝试访问产品页面,但该项目不再可用,我将重定向回他们之前查看的项目类别,并根据我在URL中指定的错误ID显示错误。

www.example.com/view_category.php?product_category_id=4 & ERROR_ID = 5

有两件事情我不喜欢这种方法:

  1. 它显示ERROR_ID在URL。
  2. 如果页面被刷新,错误仍会显示。

有没有办法从URL中干净地删除特定的$ _GET变量,同时保持其余的变量完整后页面加载?

我想也许它使用modRewrite或重定向回到页面本身,但从URL中删除error_id或使用$ _SESSION变量,并避免将error_id放入URL中。你的想法?

我真的从这个社区学到很多东西,我想如果我提出这个问题,我可能会学到一些新的东西,或者得到一些不同的想法,因为我对于脚本编程还很陌生。

回答

7

不,没有办法明确地做 - 至少不是没有页面刷新,但是无论如何你会丢失数据。

你最好使用临时会话变量。

if (/* error condition */) 
{ 
    $_SESSION['last_error_id'] = 5; 
    header('Location: http://www.example.com/view_category.php?product_category_id=4'); 
} 

然后,在view_category.php

if (isset($_SESSION['last_error_id'])) 
{ 
    $errorId = $_SESSION['last_error_id']; 
    unset($_SESSION['last_error_id']); 

    // show error #5 
} 
+1

如果用户一次打开多个选项卡,那么在另一个页面有机会加载并显示错误之前,您有可能未设置会话变量。这就是为什么我建议引用方法。 – 2009-07-30 23:34:42

+0

这只会是一个问题,如果其他标签在加载中。唯一的后果是该错误消息不会显示在加载2nd的选项卡上。对? – justinl 2009-07-30 23:43:38

+0

引荐者也不是一个坏主意,但它不是万无一失的。此外,他说的是在URL中根本不存在error_id,而检查引用者没有处理。 此外,这就是为什么MVC如此流行 - 要求错误只被转发到错误控制器,并且实际上不会发生页面刷新。 – 2009-07-30 23:45:23

1

一种方法是将HTTP_REFERERSCRIPT_NAME进行比较。如果用户点击刷新,它们将是相同的。

2

首先,登录你的数据库:)

之后的错误,设置Cookie会话变量,然后将用户重定向到安全页。加载该页面时,请检查该变量,显示错误,然后从Cookie或会话数组中删除变量。

0

快速哈克:你也可以有imploded()“上的该$_SERVER['QUERY_STRING']变量‘&’D以操纵字符串,然后explode()倒是回来。

3

是的,有一种方法来去除especific从PHP $_GET ...

 varToRemove = "anyVariable"; 

     foreach($_GET as $variable => $value){ 
     if($variable != varToRemove){ 
      $newurl .= $variable.'='.$value.'&'; 
     } 
     } 

     $newurl = rtrim($newurl,'&'); 

然后,把$ NEWURL中的链接..像这样:

pageurl?something=something&<? echo $newurl; ?>

我知道it's旧的文章,但是,其他的编程人员可能会寻找它!

0

这种方法不行吗?

<?php 
    $params = array_diff($_GET, array("variable_name" => $value)); 
    $new_query_string = http_build_query($params); 
?> 
    <script>window.history.pushState('verify_email', 'Verify Email', '?<?php echo $new_query_string; ?>');</script> 
0

我有同样的问题
尝试:完美http://www.azazia.com/kb/entry/26/

if (!empty($_GET['passvar'])) { 
    unset($_GET['passvar']); 
    echo "<META HTTP-EQUIV=\"refresh\" CONTENT=\"0; URL=".$_SERVER['PHP_SELF']."\" >"; 

}

为我工作。