2008-12-11 22 views
4

Disons que j'ai un code comme celui-ciHTTP persistantes GET variables PHP

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

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

Si un utilisateur est à example.com/?foo=abc et clique sur un lien pour définir bar = xyz, je veux pour les emmener facilement à example.com/?foo=abc & bar = xyz, plutôt que example.com/?bar=xyz.

Je peux penser à quelques manières très désordonnées de faire ceci, mais je suis sûr qu'il y a quelque chose de plus propre que je ne sais pas et n'ai pas pu traquer par l'intermédiaire de Google.

Répondre

2

est ici une façon ....

//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

Très agréable. Bien que vous auriez pu utiliser http_build_query pour construire la requête. Bravo. –

0

Il suffit de définir le lien qui change la barre en xyz pour avoir aussi foo = abc si foo est déjà défini.

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

Vous devrez rendre les liens avec la chaîne de requête URL appropriée pour que cela se produise. C'est une décision de conception que vous devrez prendre de votre côté en fonction de la configuration de votre système.

J'ai certains sites qui ont ce problème, et ce que je fais est de configurer une variable globale querystring qui définit les données de la page en cours en haut de la demande de la page.

Puis, quand je suis rendu la page, si je dois utiliser la chaîne de requête que je fais quelque chose comme:

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

Ce n'est pas propre, mais tout dépend de la façon dont fonctionne votre système.

1

Si vous mettez à jour la chaîne de requête dont vous avez besoin ot vous assurer de ne pas faire quelque chose comme

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

Qu'est-ce que vous voulez vraiment faire est écraser la clé actuelle si nécessaire. Vous pouvez utiliser une fonction comme celle-ci. (Avertissement: Du haut de ma tête, peut-être un peu buggé)

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

Enregistrer un code et utiliser le intégré http_build_query. J'utiliser cette enveloppe dans l'un de mes projets:

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; 
} 

En outre, bien qu'il ne soit pas souvent utilisé, vous pouvez avoir _GET $ sur le côté gauche à la main d'une mission:

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

Autre que de faire ce que Paul Dixon a dit.