Obter parâmetros de sequência de consulta de URL

322

Qual é a maneira "menos código necessário" para obter parâmetros de uma string de consulta de URL formatada da seguinte maneira?

www.mysite.com/category/subcategory?myqueryhash

A saída deve ser: myqueryhash

Estou ciente dessa abordagem:

www.mysite.com/category/subcategory?q=myquery

<?php
   echo $_GET['q'];  //Output: myquery
?>
enloz
fonte

Respostas:

527

$_SERVER['QUERY_STRING'] contém os dados que você está procurando.


DOCUMENTAÇÃO

Filip Roséen - refp
fonte
28
print_r ($ _ SERVER) para encontrar valores relacionados
22
nota: $_SERVER['QUERY_STRING']vai mostrar foo=bar2para consulta string comofoo=bar1&foo=bar2
Timo Huovinen
3
Para obter uma saída mais legível, você pode quebrar a print_r()declaração em <pre>tags: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
Amal Murali
1
@RJAnoop Nesse caso, qstring faz parte da URL para que você possa usá-la $_SERVER['REQUEST_URI'], embora você possa considerar o uso de mod_rewrite para passar essa parte da URL como uma variável. Veja stackoverflow.com/questions/16388959/url-rewriting-with-php
nullability
5
Então, por que isso é melhor do que usar $ _GET?
#
92

A maneira do PHP fazer isso é usar a função parse_url , que analisa uma URL e retorna seus componentes. Incluindo a string de consulta.

Exemplo:

$url = 'www.mysite.com/category/subcategory?myqueryhash';
echo parse_url($url, PHP_URL_QUERY); # output "myqueryhash"

Documentação completa aqui

medina
fonte
15
Esta é realmente a melhor resposta com base na pergunta. As outras respostas obtêm apenas o URI atual, enquanto a pergunta especifica apenas "do URL".
31813 Chris Harrison
80

A função parse_str()lê automaticamente todos os parâmetros de consulta em uma matriz.

Por exemplo, se o URL for http://www.example.com/page.php?x=100&y=200, o código

$queries = array();
parse_str($_SERVER['QUERY_STRING'], $queries);

irá armazenar parâmetros na $queriesmatriz ( $queries['x']=100, $queries['y']=200).

Veja a documentação de parse_str


EDITAR

De acordo com a documentação do PHP, parse_str()só deve ser usado com um segundo parâmetro. O uso parse_str($_SERVER['QUERY_STRING'])desse URL criará variáveis $xe $y, o que torna o código vulnerável a ataques como http://www.example.com/page.php?authenticated=1.

sbrbot
fonte
52
..e é uma função má e má que não deveria existir.
Zenexer
6
Zenexer, você pode elaborar um pouco mais a sua declaração? Por que isso é um mal?
Sbrbot
26
Você nunca deve transformar cegamente os parâmetros da string de consulta em variáveis. O que você acha que acontece se alguém usa uma chave que corresponde a uma variável real? Está pedindo explorações. É por isso que esse recurso é altamente desencorajado. Você pode configurar o PHP para fazer isso automaticamente, sem chamar parse_str, mas, naturalmente, é considerado um não-não.
Zenexer
42
Você pode usar o segundo parâmetro de parse_str (). - parse_str($_SERVER['QUERY_STRING'], $params);- agora o $paramsarray conterá todos os valores da string de consulta.
Amal Murali
13
"Você nunca deve transformar cegamente os parâmetros da string de consulta em variáveis" Essas declarações são totalmente absurdas. "Nunca" -> como você sabe que tipo de situações um codificador enfrentará em uma hora aleatória de um dia de trabalho aleatório ........ Bobagem absoluta. Não existe uma palavra como 'nunca'. QUALQUER COISA é perigosa quando você a usa de maneira errada, QUALQUER COISA é útil quando você a usa de maneira correta ....... 10 anos atrás, muitas pessoas estavam conversando assim com os IFRAMEs. mal, estupidez absoluta. risco de segurança absoluto. em seguida, veio facebook, em seguida, veio social iframe em todos os lugares e ninguém está falando desse jeito agora ....
unity100
42

Se você deseja toda a cadeia de consulta:

$_SERVER["QUERY_STRING"]
Jason T Featheringham
fonte
25

Vou recomendar a melhor resposta como

<?php echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!'; ?>

Supondo que o usuário inseriu http://example.com/?name=Hannes

O exemplo acima apresentará:

Olá Hannes!

user3816325
fonte
4
Essa é a maneira mais rápida e fácil de obter os vars da string de consulta fornecida.
Mirko Brunner
2
O OP perguntado como obter o param de consulta de URL example.com/?Hannes...
Philipp
5

Além disso, se você estiver procurando pelo nome do arquivo atual junto com a string de consulta, precisará apenas seguir

basename($_SERVER['REQUEST_URI'])

Forneceria informações como exemplo a seguir

file.php? arg1 = val & arg2 = val

E se você também quiser o caminho completo do arquivo, começando pelo root, por exemplo, /folder/folder2/file.php?arg1=val&arg2=val, remova a função basename () e use o preenchimento

$_SERVER['REQUEST_URI']
K. Shahzad
fonte
2
/é um caractere válido nas cadeias de consulta (consulte RFC 3986 ), portanto você não pode confiar basename.
Cairnarvon 16/01
1
Isso não funcionará se a string de consulta tiver uma barra e, portanto, é insegura. É melhor obter a string de consulta, removê-la do final do URI da solicitação e depois executar basename () - depois, é claro, adicione a string de consulta ao final.
Zenexer
4

Aqui está minha função para reconstruir partes da string de consulta do REFERRER .

Se a página de chamada já tiver uma string de consulta em seu próprio URL , e você deverá voltar a essa página e desejar enviar alguns, não todos, esses $_GETvars (por exemplo, um número de página).

Exemplo: a string de consulta do referenciador estava ?foo=1&bar=2&baz=3chamando refererQueryString( 'foo' , 'baz' )retornos foo=1&baz=3":

function refererQueryString(/* var args */) {

    //Return empty string if no referer or no $_GET vars in referer available:
    if (!isset($_SERVER['HTTP_REFERER']) ||
        empty( $_SERVER['HTTP_REFERER']) ||
        empty(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY ))) {

        return '';
    }

    //Get URL query of referer (something like "threadID=7&page=8")
    $refererQueryString = parse_url(urldecode($_SERVER['HTTP_REFERER']), PHP_URL_QUERY);

    //Which values do you want to extract? (You passed their names as variables.)
    $args = func_get_args();

    //Get '[key=name]' strings out of referer's URL:
    $pairs = explode('&',$refererQueryString);

    //String you will return later:
    $return = '';

    //Analyze retrieved strings and look for the ones of interest:
    foreach ($pairs as $pair) {
        $keyVal = explode('=',$pair);
        $key = &$keyVal[0];
        $val = urlencode($keyVal[1]);
        //If you passed the name as arg, attach current pair to return string:
        if(in_array($key,$args)) {
            $return .= '&'. $key . '=' .$val;
        }
    }

    //Here are your returned 'key=value' pairs glued together with "&":
    return ltrim($return,'&');
}

//If your referer was 'page.php?foo=1&bar=2&baz=3'
//and you want to header() back to 'page.php?foo=1&baz=3'
//(no 'bar', only foo and baz), then apply:

header('Location: page.php?'.refererQueryString('foo','baz'));
Adriana
fonte
4

Este código e notação não é meu. Evan K resolve uma consulta de mesmo valor com uma função personalizada;) é obtida de:

http://php.net/manual/en/function.parse-str.php#76792 Os créditos são para Evan K.

É importante mencionar que o parse_str interno NÃO processa uma sequência de consultas da maneira padrão CGI, quando se trata de campos duplicados. Se vários campos com o mesmo nome existirem em uma string de consulta, todas as outras linguagens de processamento da Web os lerão em uma matriz, mas o PHP os substituirá silenciosamente:

<?php
# silently fails to handle multiple values
parse_str('foo=1&foo=2&foo=3');

# the above produces:
$foo = array('foo' => '3');
?>

Instead, PHP uses a non-standards compliant practice of including brackets in fieldnames to achieve the same effect.

<?php
# bizarre php-specific behavior
parse_str('foo[]=1&foo[]=2&foo[]=3');

# the above produces:
$foo = array('foo' => array('1', '2', '3') );
?>

This can be confusing for anyone who's used to the CGI standard, so keep it in mind.  As an alternative, I use a "proper" querystring parser function:

<?php
function proper_parse_str($str) {
  # result array
  $arr = array();

  # split on outer delimiter
  $pairs = explode('&', $str);

  # loop through each pair
  foreach ($pairs as $i) {
    # split into name and value
    list($name,$value) = explode('=', $i, 2);

    # if name already exists
    if( isset($arr[$name]) ) {
      # stick multiple values into an array
      if( is_array($arr[$name]) ) {
        $arr[$name][] = $value;
      }
      else {
        $arr[$name] = array($arr[$name], $value);
      }
    }
    # otherwise, simply stick it in a scalar
    else {
      $arr[$name] = $value;
    }
  }

  # return result array
  return $arr;
}

$query = proper_parse_str($_SERVER['QUERY_STRING']);
?>
aimiliano
fonte
3

Graças a @K. Shahzad Isso ajuda quando você deseja que a string de consulta reescrita sem nenhuma adição de reescrita. Digamos que você reescreva o / test /? X = y em index.php? Q = teste & x = y e você deseja apenas a string de consulta.

function get_query_string(){

    $arr = explode("?",$_SERVER['REQUEST_URI']);
    if (count($arr) == 2){
        return "";
    }else{
        return "?".end($arr)."<br>";
    }       
}
$query_string = get_query_string();
Sjaak Wish
fonte
2

Linguagem de programação: PHP

// Inintialize URL to the variable 
$url = 'https://www.youtube.com/watch?v=qnMxsGeDz90'; 

// Use parse_url() function to parse the URL 
// and return an associative array which 
// contains its various components 
$url_components = parse_url($url); 

// Use parse_str() function to parse the 
// string passed via URL 
parse_str($url_components['query'], $params); 

// Display result 
echo 'v parameter value is '.$params['v'];

Isso funcionou para mim. Espero que também ajude você :)

Kamlesh
fonte
Saída: v o valor do parâmetro é qnMxsGeDz90
Kamlesh
1

Para obter cada nó no URI, você pode usar a função explode()para $ _SERVER ['REQUEST_URI']. Se você deseja obter strings sem saber se foi aprovado ou não. você pode usar a função que eu me defini para obter parâmetros de consulta de $ _REQUEST (pois funciona para os parâmetros POST e GET).

function getv($key, $default = '', $data_type = '')
{
    $param = (isset($_REQUEST[$key]) ? $_REQUEST[$key] : $default);

    if (!is_array($param) && $data_type == 'int') {
        $param = intval($param);
    }

    return $param;
}

Pode haver alguns casos em que queremos que os parâmetros da consulta sejam convertidos no tipo Inteiro, então adicionei o terceiro parâmetro a essa função.

Paul Z.
fonte