更改超链接中的$ _GET变量而不是附加它

时间:2014-05-12 15:13:54

标签: php

我有一个软件下载页面,您可以在其中显示不同类别的软件。像统计软件,办公软件,安全软件等。结果可以通过GET过滤,如url.com?type=office将带您进入办公室软件。

我还有一些链接可以通过操作系统来过滤它 url.com?type=office&os=windows

但我如何拥有像这样的链接<a href="url.com?os=windows">Only Windows</a> 同时保留所有以前的选择,如软件类型,同时不附加网址,避免任何这种情况

url.com?type=office&os=windows&os=windows&os=linux

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

我可能先写一个函数[1]:

function buildURL($base, $key, $val)
{
    $data = $_GET;
    $data[$key] = $val;
    return sprintf('%s?%s', $base, http_build_query($data));
}

将当前的$ _GET数组复制到临时数组($data)中,使用值$key设置/覆盖数组的$val值,然后重建并返回URL

然后,对于您要生成的每个链接,您可以使用

<a href="<?= buildURL('url.php', 'os', 'windows'); ?>">Windows Only</a>

无论os是否已设置(对任何内容)或未设置,上述链接都会生成相同的内容。它还会保留查询字符串中的任何其他键值对。

换句话说:

Current Query String                Generated Link
url.php                    =>       url.php?os=windows
url.php?os=linux           =>       url.php?os=windows
url.php?type=office        =>       url.php?os=windows&type=office

[1]代码未经测试,但这是一般的想法。


此外,您可以将功能修改为:

function buildURL($base, $overrides)
{
    $data = array_merge($_GET, $overrides);
    return sprintf('%s?%s', $base, http_build_query($data));
}

然后你会用以下内容调用:

<?= buildURL('url.php', array('os'=>'windows', 'type'=>'office')); ?>

如果您想一次“覆盖”多个键/值对。


或者,您可以使用隐藏表单元素和Javascript的某种组合,但严格的服务器端实现似乎更好。

答案 1 :(得分:1)

您可以像这样创建链接

$type = $os = "";

if(isset($_GET["type"])){
  $type = $_GET["type"];
}

if(isset($_GET["os"])){
  $os = $_GET["os"];
}

$link = "<a href='url.com?type=$type&os=$os'>Some Text </a>";
echo $link;

答案 2 :(得分:0)

$_SERVER['REQUEST_URI']将返回附加了所有查询字符串的网址。您可以执行以下操作:

<?
$url = $_SERVER['REQUEST_URI'];
$url = substr($url, strpos($url, "?") + 1);  
parse_str($url, $url);

var_dump($url);
?>

这将创建一个充满您的值的数组 array(3) { ["os"]=> string(7) "windows" ["type"]=> string(6) "office" }等。您可以使用http_build_query根据这些值重建查询。

或者,如果您改用parse_str($url, $url);,它会为每个查询名称和值设置变量。 (即$os = windows;)。然后,您可以检查是否已设置并使用案例或if语句相应地构建您的URL。如果您需要帮助,请告诉我。