检查URL是否包含参数。

17

可能是重复问题:
如何在分页时保留URL参数

我想使用PHP将参数添加到当前URL中,但我如何知道URL是否已经包含了一个参数?

例如:

foobar.com/foo/bar/index.php => foobar.com/foo/bar/index.php?myparameter=5 foobar.com/index.php?foo=7 => foobar.com/index.php?foo=7&myparameter=5

主要问题在于我不知道是否需要添加“?”。

我的代码(从某处找到,但它无效):

<?php   if(/?/.test(self.location.href)){ //if url contains ?
    $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]&myparameter=5";
} else {
    $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]?myparameter=5"; 
}?>

1
@Puyol,你不应该使用常量作为数组键,而是应该用花括号包裹或者将其从字符串中分离并进行连接。例如:"http://{$_SERVER['HTTP_HOST']}..." - Lawrence Cherone
3个回答

40

URL 参数是从一个名为 $_GET 的全局变量中获取的,实际上它是一个数组。因此,要知道 URL 是否包含参数,您可以使用 isset() 函数。

if (isset($_GET['yourparametername'])) {
    //The parameter you need is present
}

随后,您可以创建一个单独的数组,其中包含需要附加到URL的参数。例如:

if(isset($_GET['param1'])) {
    \\The parameter you need is present
    $attachList['param1'] = $_GET['param1'];
}
if(isset($_GET['param2'])) {
    $attachList['param2'] = $_GET['param2];
}

现在,要确定是否需要一个?符号,只需计算此数组

if(count($attachList)) {
    $link .= "?";
    // and so on
}

更新:

要知道是否设置了任何参数,只需计算$_GET中的数量。

if(count($_GET)) {
     //some parameters are set
}

我不想知道我的参数是否设置,我想知道是否设置了任何参数。 - Puyol
实际上,仍然可以拥有这样的URL:http://example.com/? 因此,在这种情况下,没有参数,但他仍然不应该添加?字符。 - Moshe Shaham
2
count($_GET) ? '&' : '?' - Amirmasoud
我在你的更新中添加了 empty,如下所示:if(empty(count($_GET))){ 当没有参数时 :p :) - Joe Kdw
关于mod-rewrite的URL,它们的$_GET计数总是会被设置吗? - Tomasz

21

你应该使用parse_url()函数:

<?php
$url = parse_url($_SERVER['REQUEST_URI']);

if(isset($url['query'])){
    //Has query params
}else{
    //Has no query params
}
?> 

您还应该使用大括号将基于数组的变量括起来或将其分离出字符串:

$url = "http://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}?myparameter=5";

或者

$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."?myparameter=5";

启用error_reporting(E_ALL);,您将看到错误提示。注意:使用未定义的常量REQUEST_URI - 假定为 'REQUEST_URI'等。


通过在parse_url中使用PHP_URL_PATH作为第二个参数,它不会传递$url['query'],因此您的isset($url['query'])将始终为false。只需删除PHP_URL_PATH作为第二个参数即可正常工作。感谢您的答案,因为当$_GET不可用时,这对我更有意义。 - Chris
@Chris 是的,你说得对,谢谢。 - Lawrence Cherone

7
您可以像这样搜索“?”字符:
if (strpos($_SERVER[REQUEST_URI], '?')) { // returns false if '?' isn't there
    $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]&myparameter=5";
} else {
    $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]?myparameter=5"; 
}

简而言之,感谢这个最酷的技巧。<?php echo "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]".((strpos($_SERVER['REQUEST_URI'],'?'))?'&':'?')."myparameter=5" - Eugine Joseph

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