【问题标题】:How to remove a specific $_GET variable from a URL如何从 URL 中删除特定的 $_GET 变量
【发布时间】:2009-07-30 23:15:15
【问题描述】:

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

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

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

我不喜欢这种方法有两点:

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

有没有办法从 URL 中彻底删除特定的 $_GET 变量,同时在页面加载后保留其余变量不变?

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

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

【问题讨论】:

    标签: php error-handling get


    【解决方案1】:

    不,没有办法明确地做到这一点 - 至少在没有页面刷新的情况下不会,但无论如何你都会丢失数据。

    最好使用临时会话变量。

    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
    }
    

    【讨论】:

    • 如果用户一次打开多个选项卡,那么您有可能在另一个页面有机会加载之前取消设置会话变量,从而显示错误。这就是我推荐referrer方法的原因。
    • 只有在另一个选项卡处于加载过程中时才会出现问题。唯一的后果是错误消息不会显示在第二个加载的选项卡上。对吗?
    • Referrer 也不错,但也不是万无一失的。此外,他说的是在 URL 中根本不存在 error_id,这是检查引用者无法解决的问题。此外,这也是 MVC 如此受欢迎的原因 - 请求错误只是转发到错误控制器,实际上并没有发生页面刷新。
    • 这并没有解决来自另一个站点的链接的问题。例如,假设我想从此网址中删除“lang”:myweb/page?id=123&lang=2&etc=hello
    • @Richard - 是的,但如果你仔细阅读,你会发现这个问题实际上并不是关于删除 URL 参数 - 它是关于如何触发给定用户的错误显示而不会造成混乱网址。
    【解决方案2】:

    是的,有一种方法可以从 PHP 中删除特定的 $_GET...

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

    然后,将 $newurl 放入链接中.. 像这样:

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

    我知道这是一个旧帖子,但是,其他程序员可能正在搜索它!

    【讨论】:

      【解决方案3】:

      首先,在你的数据库中记录错误:)

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

      【讨论】:

      • 那么,当用户遇到错误时,我应该将错误 ID 以及可能的 URL 和日期插入到 mysql 表中,这通常被认为是一个好主意吗?记录这些数据后,您将如何对其进行排序/理解?
      • 用户通常不可靠。他们很少/不会在出现错误时告诉您,因此最好记录尽可能多的信息。
      • 我不是特别同意这一点。数据库错误日志记录用于发生意外事件时。用户使用不再可用的项目点击页面是预期的行为。
      • 是否还要存储遇到错误的人的用户 ID?
      • @Peter,是的,我同意。记录错误时需要一些判断力,这样您的服务器就不会被记录的 404 错误填满:)
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        快速破解:您还可以在 $_SERVER['QUERY_STRING'] 变量中的“&”上使用 imploded()'d 来操作该字符串,然后 explode()'d 将其返回。

        【讨论】:

        • parse_str() 和 http_build_query() 是用于处理查询数据的更好、更定制的函数。
        【解决方案6】:

        这种方法行不通吗?

        <?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>
        

        【讨论】:

          【解决方案7】:

          我有同样的问题
          试试看: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']."\" >";
          

          }

          为我工作完美。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多