47 votes

Comment obtenir les paramètres multiples avec le même nom à partir d'une URL en PHP

J'ai une application en PHP qui va sur l'occasion, d'avoir à gérer les Url où plus d'un paramètre dans l'URL aura le même nom. Est-il un moyen facile de récupérer toutes les valeurs d'une clé donnée? PHP $_GET retourne uniquement la dernière valeur.

Pour faire de ce béton, ma demande est un résolveur OpenURL, et peuvent obtenir les paramètres d'URL comme ceci:

ctx_ver=Z39.88-2004
&rft_id=info:oclcnum/1903126
&rft_id=http://www.biodiversitylibrary.org/bibliography/4323
&rft_val_fmt=info:ofi/fmt:kev:mtx:book
&rft.genre=book
&rft.btitle=At last: a Christmas in the West Indies. 
&rft.place=London,
&rft.pub=Macmillan and co.,
&rft.aufirst=Charles
&rft.aulast=Kingsley
&rft.au=Kingsley, Charles,
&rft.pages=1-352
&rft.tpages=352
&rft.date=1871

(Oui, je sais, c'est moche, bienvenue dans mon monde). Notez que la touche "rft_id" apparaît deux fois:

  1. rft_id=info:oclcnum/1903126
  2. rft_id=

http://www.biodiversitylibrary.org/bibliography/4323 sera de retour juste , la valeur précédente ($_GET) ayant été remplacé.

J'aimerais avoir accès à la fois à des valeurs. Est-ce possible en PHP? Si non, toute réflexion sur la façon de gérer ce problème?

74voto

Tomalak Points 150423

Quelque chose comme:

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  list($name, $value) = explode('=', $param);
  $params[urldecode($name)][] = urldecode($value);
}

vous donne:

array(
  'ctx_ver'     => array('Z39.88-2004'),
  'rft_id'      => array('info:oclcnum/1903126', 'http://www.biodiversitylibrary.org/bibliography/4323'),
  'rft_val_fmt' => array('info:ofi/fmt:kev:mtx:book'),
  'rft.genre'   => array('book'),
  'rft.btitle'  => array('At last: a Christmas in the West Indies.'),
  'rft.place'   => array('London'),
  'rft.pub'     => array('Macmillan and co.'),
  'rft.aufirst' => array('Charles'),
  'rft.aulast'  => array('Kingsley'),
  'rft.au'      => array('Kingsley, Charles'),
  'rft.pages'   => array('1-352'),
  'rft.tpages'  => array('352'),
  'rft.date'    => array('1871')
)

46voto

benlumley Points 8114

Ne pas travailler pour vous comme il semble que vous n'avez pas le contrôle de la chaîne de requête, mais une autre réponse valable: au Lieu d'analyser la chaîne de recherche, vous pouvez appeand '[]' à la fin de ce nom, PHP va faire un tableau des éléments.

C'est à dire:

someurl.php?name[]=aaa&name[]=bbb

vous donnera un $_GET qui ressemble à:

array(0=>'aaa', 1=>'bbb')

10voto

Stefan Gehrig Points 47227

Je pense que vous auriez à analyser $_SERVER['QUERY_STRING'] manuellement.

Quelque chose comme (non testé):

$query = $_SERVER['QUERY_STRING'];
$vars = array();
foreach (explode('&', $query) as $pair) {
    list($key, $value) = explode('=', $pair);
    $vars[] = array(urldecode($key), urldecode($value));
}

Cela devrait vous donner un tableau $vars:

array(
    array('ctx_ver'     => 'Z39.88-2004'),
    array('rft_id'      => 'info:oclcnum/1903126'),
    array('rft_id'      => 'http://www.biodiversitylibrary.org/bibliography/4323'),
    array('rft_val_fmt' => 'info:ofi/fmt:kev:mtx:book'),
    array('rft.genre'   => 'book'),
    array('rft.btitle'  => 'At last: a Christmas in the West Indies.'),
    array('rft.place'   => 'London'),
    array('rft.pub'     => 'Macmillan and co.'),
    array('rft.aufirst' => 'Charles'),
    array('rft.aulast'  => 'Kingsley'),
    array('rft.au'      => 'Kingsley, Charles'),
    array('rft.pages'   => '1-352'),
    array('rft.tpages'  => '352'),
    array('rft.date'    => '1871')
)

Après avoir vu Tomalak de réponse, j'aime son format de données pour le tableau qui en résulte beaucoup mieux, car il rend possible l'accès à des touches spécifiques par leur nom.

2voto

Neil Aitken Points 5023

Autant que je sache, il n'existe aucun moyen pour obtenir des valeurs en double à l'aide de $_GET comme deuxième valeur remplacera le premier

Pour obtenir autour d'elle, vous pouvez accéder à la crue de la chaîne de recherche à l'aide de la variable $_SERVER['QUERY_STRING'] et ensuite d'analyser vous-même.

2voto

MonsterDev Points 11

Suppose que vous avez une chaîne de requête comme ceci:

param1=2549&appname=appName1&appname=appName2&appname=appName3&appname=appName4&appname=appName5&apptype=thetype&idsess=1231324567980147dzeze55sd4&action=myaction

Vous pouvez faire ceci :

public static function getMultipleParameters()
    {
        $query = $_SERVER['QUERY_STRING'];
        $vars = array();
        $second = array();
        foreach (explode('&', $query) as $pair) {
            list($key, $value) = explode('=', $pair);
            if('' == trim($value)){
                continue;
            }

            if (array_key_exists($key, $vars)) {
                if (!array_key_exists($key, $second))
                    $second[$key][] .= $vars[$key];
                $second[$key][] = $value;
            } else {
                $vars[$key] = urldecode($value);
            }
        }
        return array_merge($vars, $second);
    }

Ce qui donne :

array (
  'param1' => '2549',
  'appname' => 
      array (
        0 => 'appName1',
        1 => 'appName2',
        2 => 'appName3',
        3 => 'appName4',
        4 => 'appName5',
  ),
  'apptype' => 'thetype',
  'idsess' => '1231324567980147dzeze55sd4',
  'action' => 'myaction',
);

Espère que ça aide ;)

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