4

假设我有一些这样的代码

if(isset($_GET['foo']))
  //do something

if(isset($_GET['bar']))
  //do something else

如果用户在 example.com/?foo=abc 并单击链接以设置 bar=xyz,我想轻松地将他们带到 example.com/?foo=abc&bar=xyz,而不是 example.com/?bar =xyz。

我可以想到一些非常混乱的方法来做到这一点,但我确信有一些我不知道并且无法通过谷歌追踪的更干净的方法。

4

5 回答 5

2

这是一种方法....

//get passed params
//(you might do some sanitizing at this point)
$params=$_GET;

//morph the params with new values
$params['bar']='xyz';

//build new query string
$query='';
$sep='?';
foreach($params as $name=>$value)
{
    $query.=$sep.$name.'='.urlencode($value);
    $sep='&';
}
于 2008-12-11T23:18:44.777 回答
1

如果您正在更新查询字符串,则需要确保您不执行类似的操作

$qs="a=1&b=2";
$href="$qs&b=4";
$href contains "a=1&b=2&b=4"

如果需要,您真正想要做的是覆盖当前密钥。您可以使用这样的功能。(免责声明:离开我的头顶,可能有点窃听)

    function getUpdateQS($key,$value)
    {
       foreach ($_GET as $k => $v)
       {
            if ($k != $key)
            {
                $qs .= "$k=".urlencode($v)."&"
            }
            else
            {
                $qs .= "$key=".urlencode($value)."&";
            }
        }
        return $qs
    }

    <a href="reports.php?<?getupdateqs('name','byron');?">View report</a>
于 2008-12-11T23:19:19.457 回答
0

如果已经设置了 foo ,只需设置将 bar 更改为 xyz 的链接也具有 foo=abc 。

$link = ($_GET['foo'] == 'abc') ? 'foo=abc&bar=xyz' : 'bar=xyz';
?>
<a href="whatever.php?<?= $link ?>">Click Me</a>
于 2008-12-11T23:06:34.193 回答
0

您必须使用正确的 URL 查询字符串呈现链接才能实现这一点。这是您最终需要根据系统设置方式做出的设计决策。

我有一些网站有这个问题,我所做的是设置一个查询字符串全局变量,将当前页面数据设置为页面请求的顶部。

然后,当我渲染页面时,如果我需要使用当前的查询字符串,我会执行以下操作:

echo '<a href="myurl.php' . querystring . '&bar=foo';

它不是最干净的,但这完全取决于您的系统如何工作。

于 2008-12-11T23:07:12.320 回答
0

保存一些代码并使用内置的http_build_query。我在我的一个项目中使用了这个包装器:

function to_query_string($array) {
    if(is_scalar($array)) $query = trim($array, '? \t\n\r\0\x0B'); // I could split on "&" and "=" do some urlencode-ing here
    else $query = http_build_query($array);
    return '?'.$query;
}

此外,虽然它不经常使用,但您可以将 $_GET 放在赋值的左侧:

$_GET['overriden_or_new'] = 'new_value';
echo '<a href="'.to_query_string($_GET).'">Yeah!</a>';

除此之外,按照保罗迪克森所说的去做。

于 2008-12-12T00:22:46.707 回答