102 votes

Manipuler une chaîne d'URL en ajoutant des paramètres GET

Je souhaite ajouter des paramètres GET aux URL qui peuvent ou non contenir des paramètres GET sans répéter ? ou & .

Exemple:

Si je veux ajouter category=action

 $url="http://www.acme.com";
 // will add ?category=action at the end

$url="http://www.acme.com/movies?sort=popular";
 // will add &category=action at the end

Si vous remarquez, j'essaie de ne pas répéter le point d'interrogation s'il est trouvé.

L'URL est juste une chaîne.

Quel est un moyen fiable d'ajouter un paramètre GET spécifique ?

203voto

andrewtweber Points 2850

Méthode de base

 $query = parse_url($url, PHP_URL_QUERY);

// Returns a string if the URL has parameters or NULL if not
if ($query) {
    $url .= '&category=1';
} else {
    $url .= '?category=1';
}

Plus avancé

 $url = 'http://example.com/search?keyword=test&category=1&tags[]=fun&tags[]=great';

$url_parts = parse_url($url);
// If URL doesn't have a query string.
if (isset($url_parts['query'])) { // Avoid 'Undefined index: query'
    parse_str($url_parts['query'], $params);
} else {
    $params = array();
}

$params['category'] = 2;     // Overwrite if exists
$params['tags'][] = 'cool';  // Allows multiple values

// Note that this will url_encode all values
$url_parts['query'] = http_build_query($params);

// If you have pecl_http
echo http_build_url($url_parts);

// If not
echo $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . '?' . $url_parts['query'];

Vous devriez au moins le mettre dans une fonction, sinon dans une classe.

65voto

rybo111 Points 1318

Voici une version plus courte de la réponse acceptée :

 $url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . 'category=action';

Edit: comme indiqué dans la réponse acceptée, cela est défectueux en ce sens qu'il ne vérifie pas si category existe déjà. Une meilleure solution serait de traiter le $_GET pour ce qu'il est - un tableau - et d'utiliser des fonctions telles que in_array() .

23voto

Tom Claus Points 677
$data = array('foo'=>'bar',
              'baz'=>'boom',
              'cow'=>'milk',
              'php'=>'hypertext processor');

$queryString =  http_build_query($data);
//$queryString = foo=bar&baz=boom&cow=milk&php=hypertext+processor

echo 'http://domain.com?'.$queryString;
//output: http://domain.com?foo=bar&baz=boom&cow=milk&php=hypertext+processor

8voto

Doug T. Points 33360

Utilisez strpos pour détecter un ?. Depuis ? ne peut apparaître dans l'URL qu'au début d'une chaîne de requête, vous savez s'il existe déjà des paramètres et vous devez ajouter des paramètres à l'aide de &

 function addGetParamToUrl(&$url, $varName, $value)
{
    // is there already an ?
    if (strpos($url, "?"))
    {
        $url .= "&" . $varName . "=" . $value; 
    }
    else
    {
        $url .= "?" . $varName . "=" . $value;
    }
}

8voto

user2171027 Points 51

Cette fonction écrase un argument existant

 function addToURL( $key, $value, $url) {
    $info = parse_url( $url );
    parse_str( $info['query'], $query );
    return $info['scheme'] . '://' . $info['host'] . $info['path'] . '?' . http_build_query( $query ? array_merge( $query, array($key => $value ) ) : array( $key => $value ) );
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X