web-dev-qa-db-fra.com

Comment puis-je ajouter des variables GET à la fin de l'URL actuelle dans php?

J'essaie d'ajouter quelques variables GET différentes à l'URL.

Je pourrais facilement faire un en-tête de redirection vers l'URL de la page en cours, puis ajouter simplement le $ _GET ['test'] dans l'URL.

Mon problème est que j'ai certaines variables GET qui sont déjà dans l'URL. Ce que je veux faire c'est:

  • Vérifiez s'il existe des variables GET dans l'URL

    • Si ce n'est pas le cas, redirigez-le vers l'URL actuelle avec la nouvelle variable GET ['test'] à la fin de l'URL. 

    • S'il existe, mais qu'il n'y a pas de variable GET ['test'] dans l'URL, conservez ces autres valeurs GET dans l'URL et ajoutez la variable GET ['test'] à la fin de la chaîne d'URL complète.

    • S'il existe ET qu'il existe une variable GET ['test'] dans l'URL, conservez ces autres valeurs GET dans l'URL et remplacez la valeur de la variable GET ['test'] par la nouvelle valeur.

Comment puis-je vérifier toutes ces conditions?

22
zeckdude

Le moyen simple d'y parvenir est:

$params           = array_merge( $_GET, array( 'test' => 'testvalue' ) );
$new_query_string = http_build_query( $params );

Cela ne garantit pas que test sera à la fin. Si pour une raison quelconque vous en avez besoin, vous pouvez simplement faire:

$params = $_GET;
unset( $params['test'] );
$params['test']   = 'testvalue';
$new_query_string = http_build_query( $params );

Notez cependant que l'analyse des paramètres de chaîne de requête PHP peut poser des problèmes d'interopérabilité avec d'autres applications. En particulier, PHP n'accepte pas les valeurs multiples pour tout paramètre, à moins qu'il n'ait un nom semblable à un tableau.

Ensuite, vous pouvez simplement transmettre à

( empty( $_SERVER['HTTPS'] ) ? 'http://' : 'https://' ) .
( empty( $_SERVER['HTTP_Host'] ) ? $defaultHost : $_SERVER['HTTP_Host'] ) .
$_SERVER['REQUEST_URI'] . '?' . $new_query_string
37
Artefacto

J'ai créé cette fonction PHP simple basée sur Artefacto 's Answer.

function addOrUpdateUrlParam($name, $value)
{
    $params = $_GET;
    unset($params[$name]);
    $params[$name] = $value;
    return basename($_SERVER['PHP_SELF']).'?'.http_build_query($params);
}
  • Il met à jour la valeur si vous modifiez un paramètre existant. 
  • S'ajoute s'il s'agit d'une nouvelle valeur
7
M_R_K

Ce peut être juste pour des raisons Joomla, mais j'obtiens la même valeur en utilisant

$ currenturl = $ _SERVER ['REQUEST_URI'];

beaucoup moins de code. 

1
user2284001
function request_URI() {

    if(!isset($_SERVER['REQUEST_URI'])) {
        $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'];
        if($_SERVER['QUERY_STRING']) {
            $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
        }
    }
    return $_SERVER['REQUEST_URI'];
}

$_SERVER['REQUEST_URI'] = request_URI();

Courtesy: http://php.net/manual/en/reserved.variables.server.php example de LOL

Cela vous donnera l'URL par rapport à la racine avec les paramètres GET.

Si vous le souhaitez par rapport au répertoire actuel, ajoutez ce qui suit.

$current_url = explode("/", $_SERVER['REQUEST_URI']);

$current_url = $current_url[end(array_keys($current_url))];
1
N A

..

$newval = 'whatever';
if( !count($_GET) ) {
 header('Location: ?test=' . $newval);
 exit;
}
if(!isset($_GET['test'])) {
 $_SERVER['REQUEST_URI'] .= '&test='.$newval;
}
$_GET['test'] = $newval;
0
nathan