如何在php中将GET变量添加到当前url的末尾?

34

我正在尝试添加一些不同的GET变量到URL中。

我可以很容易地对当前页面的URL进行重定向,然后只需在URL中添加$_GET ['test']。

我的问题是,我已经有了一些存在于URL中的GET变量。我想要做的是:

  • 检查URL中是否有任何GET变量

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

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

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

我该如何检查所有这些条件?

7个回答

52

简单的方法如下:

$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

3
我相信这将在GET变量上翻倍。如果当前URL是domain.com/page.php?var=1,那么“然后你只需转发到”的代码的最终输出将是domain.com/page.php?var=1?var=1&test=testvalue - MarcGuay
1
用 PHP_SELF 替换 REQUEST_URI - Jeffrey Nicholson Carré
为什么需要使用:unset($params["test"]); 它不是可以被语句 $params["test"] = "testvalue"; 替代吗? - Ray S.
请查看我的答案。它非常有效,没有GET变量重复。这是一个简单的函数 ;) - M_R_K
请检查我的答案。我根据这个答案创建了一个简单的函数。 - M_R_K
如果存在重定向,REQUEST_URI和PHP_SELF都是错误的。最好的方法是通过使用explode('?', $_SERVER['REQUEST_URI'])[0]定义路径,然后在其后添加查询。 - Olivier Van Bulck

13

我基于Artefacto的回答,创建了这个简单的PHP函数。

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

2
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/zh/reserved.variables.server.php,示例由LOL提供。

这将给出与根目录相关的URL以及GET参数。

如果您想要相对于当前目录,请添加以下内容。

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

$current_url = $current_url[end(array_keys($current_url))];

1

可能只是 Joomla 的原因,但是我使用以下代码可以得到相同的值:

$currenturl = $_SERVER ['REQUEST_URI'];

这样代码量就少多了。


0

..

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

1
你知道的,附上评论是被认为是良好实践,否则答案无法改进,而且下投票没有任何作用 - 例外情况是当答案明显具有煽动性时。如果您要对与您的答案不同的备选答案进行投反对票,则这一点尤其正确;否则,它似乎只是自我服务。至于您的答案本身,我认为您过于字面理解OP的规格说明,但只有他可以确定。此外,更改$GET(或$_SERVER)是真正的良好实践。 - Artefacto
我的意思是这不是一个好习惯(编辑窗口已关闭)。 - Artefacto
现在赞了,因为你已经扩展了,之前本来想评论的,但是被孩子们拉开电脑前就没能说。 - nathan

0

我写这篇文章是因为与其他解决方案不同,它不会暴露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;
}

0

这是最简单的方法

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


它将在URL中添加新的查询参数,如果已存在则更新其值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接