2008-12-11 60 views
4

比方说,我有这样的持久HTTP GET变量是在PHP

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

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

一些代码,如果用户是在example.com/?foo=abc和点击一个链接来设置栏= XYZ,我想轻松将它们带到example.com/?foo=abc & bar = xyz,而不是example.com/?bar=xyz。

我可以想到一些非常混乱的方法来做到这一点,但我敢肯定有一些更清洁的东西,我不知道和通过谷歌追踪。

回答

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='&'; 
} 
+0

非常好。尽管您可以使用http_build_query来构建查询。喝彩。 – 2008-12-11 23:26:12

0

只要将更改栏的链接设置为xyz,并且如果foo已设置,则也具有foo = abc。

$link = ($_GET['foo'] == 'abc') ? 'foo=abc&bar=xyz' : 'bar=xyz'; 
?> 
<a href="whatever.php?<?= $link ?>">Click Me</a> 
0

你将不得不使用正确的URL查询字符串渲染链接,使之发生。这是一个设计决定,您需要根据您的系统安装方式进行设计。

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

然后当我在渲染页面,如果我需要利用当前的查询字符串的我做这样的事情:

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

这不是最干净的,但是这一切都取决于你的系统是如何工作的。

1

如果要更新,你需要OT确保你不这样做

$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> 
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>'; 

其他那么只要做一下Paul Dixon所说的话。