Πώς να πάρει πολλές παραμέτρους με το ίδιο όνομα από μια διεύθυνση URL σε PHP

ψήφοι
40

Έχω μια εφαρμογή PHP που θα σε ορισμένες περιπτώσεις πρέπει να χειριστεί διευθύνσεις URL, όπου περισσότερες από μία παράμετρο στη διεύθυνση URL θα έχουν το ίδιο όνομα. Είναι ένας εύκολος τρόπος για να ανακτήσετε όλες τις τιμές για ένα δεδομένο κλειδί εκεί; PHP $ _GET επιστρέφει μόνο την τελευταία τιμή.

Για να κάνετε αυτό το συγκεκριμένο, η αίτησή μου είναι ένα αναλυτή OpenURL, και μπορεί να πάρει τις παραμέτρους URL όπως αυτό:

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

(Ναι, ξέρω ότι είναι άσχημο, καλωσορίζω στον κόσμο μου). Σημειώστε ότι το πλήκτρο «rft_id» εμφανίζεται δύο φορές:

  1. rft_id=info:oclcnum/1903126
  2. rft_id=http://www.biodiversitylibrary.org/bibliography/4323

$_GETθα επιστρέψει μόνο http://www.biodiversitylibrary.org/bibliography/4323, η προηγούμενη τιμή ( info:oclcnum/1903126) έχουν αντικατασταθεί.

Θα ήθελα να αποκτήσετε πρόσβαση και στις δύο τιμές. Είναι αυτό δυνατό στην PHP; Αν όχι, οποιεσδήποτε σκέψεις για το πώς να χειριστεί αυτό το πρόβλημα;

Δημοσιεύθηκε 09/12/2008 στις 17:33
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
63

Κάτι όπως:

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

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

σου δίνει:

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')
)
Απαντήθηκε 09/12/2008 στις 17:46
πηγή χρήστη

ψήφοι
37

Δεν θα λειτουργήσει για σας μοιάζει να μην ελέγχει την querystring, αλλά μια άλλη έγκυρη απάντηση: Αντί να αναλύσει querystring, θα μπορούσατε να appeand «[]» στο τέλος του ονόματος, τότε η PHP θα κάνει μια σειρά από το αντικείμενα.

IE:

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

Θα σας δώσω ένα $ _GET μοιάζει με:

array(0=>'aaa', 1=>'bbb')
Απαντήθηκε 09/12/2008 στις 17:41
πηγή χρήστη

ψήφοι
9

Νομίζω ότι θα έπρεπε να αναλύσει $_SERVER['QUERY_STRING']το χέρι.

Κάτι σαν (μη δοκιμασμένο):

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

Αυτό θα σας δώσει μια σειρά $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')
)

Αφού δει Tomalak για απάντηση, μου αρέσει μορφή δεδομένων του για την προκύπτουσα σειρά πολύ καλύτερα, καθώς καθιστά δυνατή την πρόσβαση σε συγκεκριμένα πλήκτρα με το όνομά τους.

Απαντήθηκε 09/12/2008 στις 17:37
πηγή χρήστη

ψήφοι
4

Δεν υπάρχει καμία ανάγκη να χρησιμοποιήσει ηλίθιο explodeλύσεις για αυτό. Μια απλή regex μπορεί πιο εύκολα να διορθώσει ένα QUERY_STRING με πολλαπλές παραμέτρους όπως-ονομάζεται:

// Replace `&x=1&x=2` into `x[]=1&x[]=2`
$qs = preg_replace("/(?<=^|&)(\w+)(?==)/", "$1[]", $_SERVER["QUERY_STRING"]);

Στη συνέχεια είναι τόσο απλή όσο η χρήση parse_str:

parse_str($qs, $new_GET);

Η οποία έχει το πλεονέκτημα να αποκωδικοποιεί σωστά %xyURL διαφεύγει αμέσως.

Αν θέλετε απλά ένα μονό ή μερικές συγκεκριμένες παραμέτρους εξάγεται ως σειρά, στη συνέχεια, χρησιμοποιήστε (id|name)αντί για (\w+)το regex.

Απαντήθηκε 21/09/2015 στις 17:34
πηγή χρήστη

ψήφοι
2

AFAIK δεν υπάρχει κανένας τρόπος για να πάρετε διπλές τιμές, χρησιμοποιώντας $_GETως δεύτερη τιμή θα αντικαταστήσει την πρώτη

Για να πάρετε γύρω από αυτό μπορείτε να έχετε πρόσβαση τις πρώτες querystring χρήση $_SERVER['QUERY_STRING']και στη συνέχεια να αναλύσει τον εαυτό σας.

Απαντήθηκε 09/12/2008 στις 17:38
πηγή χρήστη

ψήφοι
1

Κοινή δική μου εκδοχή αυτής της λειτουργίας

function parse_mstr($query_string,&$query=array()){
    $params  = explode('&', $query_string);
    foreach( $params as $param ){
        $k = $param;
        $v = '';
        if(strpos($param,'=')){
            list($name, $value) = explode('=', $param);
            $k = rawurldecode($name);
            $v = rawurldecode($value);
        }
        if(isset($query[$k])){
            if(is_array($query[$k])){
                $query[$k][] = $v;
            }else{
                $query[$k] = array($query[$k],$v);
            }
        }else{
            $query[$k] = $v;
        }
    }
}
Απαντήθηκε 09/05/2013 στις 15:21
πηγή χρήστη

ψήφοι
1

Υποθέτουμε έχετε μια σειρά ερωτημάτων όπως αυτό:

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

Μπορείτε να το κάνετε αυτό :

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

Αυτό δίνει:

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

Ελπίδα που βοηθά?)

Απαντήθηκε 04/07/2012 στις 17:18
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more