【问题标题】:How can I add GET variables to end of the current url in php?如何在 php 中将 GET 变量添加到当前 url 的末尾?
【发布时间】:2011-03-10 21:58:25
【问题描述】:

我正在尝试向 url 添加一些不同的 GET 变量。

我可以轻松地将标头重定向到当前页面 url,然后在 url 中添加 $_GET['test']。

我的问题是我已经在 url 中有一些 GET 变量。我想做的是:

  • 检查url中是否有GET变量

    • 如果没有,则重定向到当前 url,并在 url 末尾添加新的 GET['test'] 变量。

    • 如果有,但 url 中没有 GET['test'] 变量,则将其他 GET 值保留在 url 中,并将 GET['test'] 变量添加到完整 url 的末尾字符串

    • 如果有,并且 url 中有一个 GET['test'] 变量,则将其他 GET 值保留在 url 中,并将 GET['test'] 变量值与新值交换。

如何检查所有这些情况?

【问题讨论】:

    标签: php url variables get


    【解决方案1】:

    简单的方法是:

    $params           = array_merge( $_GET, array( 'test' => 'testvalue' ) );
    $new_query_string = http_build_query( $params );
    

    这并不能保证test 会在最后。如果出于某种奇怪的原因你需要它,你可以这样做:

    $params = $_GET;
    unset( $params['test'] );
    $params['test']   = 'testvalue';
    $new_query_string = http_build_query( $params );
    

    但是请注意,PHP 查询字符串参数解析可能与其他应用程序存在一些互操作性问题。特别是,PHP 不接受任何参数的多个值,除非它具有类似数组的名称。

    那你就直接转发到

    ( empty( $_SERVER['HTTPS'] ) ? 'http://' : 'https://' ) .
    ( empty( $_SERVER['HTTP_HOST'] ) ? $defaultHost : $_SERVER['HTTP_HOST'] ) .
    $_SERVER['REQUEST_URI'] . '?' . $new_query_string
    

    【讨论】:

    • 我相信这会在 GET 变量上加倍。如果 URL 当前为domain.com/page.php?var=1,则“Then you can just forward to”代码的最终输出为domain.com/page.php?var=1?var=1&test=testvalue
    • 用 PHP_SELF 替换 REQUEST_URI
    • 为什么需要:unset($params["test"]);是不是被以下语句代替了:$params["test"] = "testvalue";
    • 在下面查看我的答案。它就像一个魅力。没有 GET var 加倍。简单的功能;)
    • 在下面查看我的答案。我根据这个答案创建了一个简单的函数
    【解决方案2】:

    我根据 Artefacto 的回答创建了这个简单的 PHP 函数。

    function addOrUpdateUrlParam($name, $value)
    {
        $params = $_GET;
        unset($params[$name]);
        $params[$name] = $value;
        return basename($_SERVER['PHP_SELF']).'?'.http_build_query($params);
    }
    
    • 如果您要更改现有参数,它会更新值。
    • 如果是新值则相加

    【讨论】:

      【解决方案3】:
      function request_URI() {
      
          if(!isset($_SERVER['REQUEST_URI'])) {
              $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'];
              if($_SERVER['QUERY_STRING']) {
                  $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
              }
          }
          return $_SERVER['REQUEST_URI'];
      }
      
      $_SERVER['REQUEST_URI'] = request_URI();
      

      礼貌:http://php.net/manual/en/reserved.variables.server.php LOL 示例

      这将为您提供与根相关的 URL 以及 GET 参数。

      如果您希望它与当前目录相关,请添加以下内容。

      $current_url = explode("/", $_SERVER['REQUEST_URI']);
      
      $current_url = $current_url[end(array_keys($current_url))];
      

      【讨论】:

        【解决方案4】:

        这可能只是 Joomla 的原因,但我通过使用得到相同的值:

        $currenturl = $_SERVER['REQUEST_URI'] ;

        代码少了很多。

        【讨论】:

          【解决方案5】:

          ..

          $newval = 'whatever';
          if( !count($_GET) ) {
           header('Location: ?test=' . $newval);
           exit;
          }
          if(!isset($_GET['test'])) {
           $_SERVER['REQUEST_URI'] .= '&test='.$newval;
          }
          $_GET['test'] = $newval;
          

          【讨论】:

          • 您知道,将您的反对票与 cmets 一起被认为是一种很好的做法,否则答案将无法改进,并且反对票也没有任何作用——除非答案明显具有煽动性。如果您对自己的替代答案投反对票,则尤其如此;否则它似乎是自私的。至于您的答案本身,我认为您过于从字面上理解了 OP 的规范,但只有他能说出来。另外,更改$GET(或$_SERVER)是非常好的做法。
          • 我的意思是这不是一个好习惯(编辑窗口已关闭)。
          • np,既然你已经扩展了,就投了赞成票,之前打算发表评论,但在我能被孩子们之前就离开了电脑;)
          【解决方案6】:

          我写这个是因为与其他解决方案不同,它不会从 htaccess 重写中暴露隐藏的 GET 参数。但它不会更新现有参数。

           function addUrlParam($name, $value)
          {
            $url = $_SERVER['REQUEST_URI'];
            $val =  $name . '=' . urlencode($value);
            if (strpos($url, '?') !== false) {
              $url .= '&' . $val;
            } else {
              $url .= '?' . $val;
            }
            return $url;
          }
          

          【讨论】:

            【解决方案7】:

            这是最简单的方法

            function buildUrl($name, $value)
             {
                $_GET[$name] = $value;
                return $_SERVER['SCRIPT_NAME'] . '?' . http_build_query($_GET);
             }
            
            

            它将新的查询参数附加到 URL 或更新它的值(如果它已经存在)

            【讨论】:

              猜你喜欢
              • 2011-03-05
              • 1970-01-01
              • 1970-01-01
              • 2013-04-16
              • 2021-11-17
              • 2021-03-29
              • 1970-01-01
              • 2017-08-25
              • 2013-08-24
              相关资源
              最近更新 更多