Obtener parámetros de cadena de consulta de URL

322

¿Cuál es la forma de "menos código necesario" para obtener parámetros de una cadena de consulta de URL con el siguiente formato?

www.mysite.com/category/subcategory?myqueryhash

La salida debe ser: myqueryhash

Soy consciente de este enfoque:

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

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

Respuestas:

527

$_SERVER['QUERY_STRING'] contiene los datos que estás buscando.


DOCUMENTACIÓN

Filip Roséen - refp
fuente
28
print_r ($ _ SERVER) para encontrar valores relacionados
22
nota: $_SERVER['QUERY_STRING']aparecerá foo=bar2para la cadena de consulta comofoo=bar1&foo=bar2
Timo Huovinen
3
Para obtener una salida más fácil de leer, se puede envolver la print_r()declaración en <pre>las etiquetas: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
Amal Murali
1
@RJAnoop En ese caso, qstring es parte de la URL para que pueda usar $_SERVER['REQUEST_URI'], aunque es posible que desee considerar el uso de mod_rewrite para pasar esa parte de la URL como una variable. Ver stackoverflow.com/questions/16388959/url-rewriting-with-php
nulabilidad
55
Entonces, ¿por qué es esto mejor que usar $ _GET?
still_dreaming_1
92

La manera de hacerlo en PHP es usando la función parse_url , que analiza una URL y devuelve sus componentes. Incluyendo la cadena de consulta.

Ejemplo:

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

Documentación completa aquí

medina
fuente
15
Esta es realmente la mejor respuesta basada en la pregunta. Las otras respuestas solo obtienen el URI actual, mientras que la pregunta solo especifica "desde URL".
Chris Harrison
80

La función parse_str()lee automáticamente todos los parámetros de consulta en una matriz.

Por ejemplo, si la URL es http://www.example.com/page.php?x=100&y=200, el código

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

almacenará parámetros en la $queriesmatriz ( $queries['x']=100, $queries['y']=200).

Mira la documentación de parse_str


EDITAR

De acuerdo con la documentación de PHP, parse_str()solo debe usarse con un segundo parámetro. El uso parse_str($_SERVER['QUERY_STRING'])de esta URL creará variables $xy $y, lo que hace que el código sea vulnerable a ataques como http://www.example.com/page.php?authenticated=1.

sbrbot
fuente
52
..y es una función malvada, malvada que no debería existir.
Zenexer
66
Zenexer, ¿puedes elaborar tu declaración un poco más? ¿Por qué esto es un mal?
sbrbot
26
Nunca debe convertir ciegamente los parámetros de la cadena de consulta en variables. ¿Qué crees que sucede si alguien usa una clave que corresponde a una variable real? Está pidiendo hazañas. Es por eso que esta característica es altamente desaconsejada. Puede configurar PHP para que haga esto automáticamente, sin llamar parse_str, pero naturalmente, se considera un no-no.
Zenexer
42
Puede usar el segundo parámetro de parse_str (). - parse_str($_SERVER['QUERY_STRING'], $params);- ahora la $paramsmatriz contendrá todos los valores de la cadena de consulta.
Amal Murali
13
"Nunca debe convertir ciegamente los parámetros de la cadena de consulta en variables". Estas declaraciones son totalmente absurdas. "Nunca" -> ¿cómo sabes qué tipo de situaciones experimentará un codificador determinado en una hora aleatoria de un día de trabajo aleatorio ....... Absurdo absoluto. No existe la palabra "nunca". CUALQUIER COSA es peligrosa cuando la usas mal, CUALQUIER COSA es útil cuando la usas correctamente ... Hace 10 años, mucha gente hablaba así sobre IFRAME. maldad, absoluta estupidez. riesgo absoluto de seguridad. luego vino Facebook, luego vino social, iframes en todas partes y nadie está hablando así ahora ...
unity100
42

Si desea toda la cadena de consulta:

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

Recomendaré la mejor respuesta como

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

Suponiendo que el usuario ingresó http://example.com/?name=Hannes

El ejemplo anterior generará:

Hola hannes

usuario3816325
fuente
44
Esta es la forma más rápida y fácil de obtener los vars de la cadena de consulta dada.
Mirko Brunner
2
El OP preguntó cómo obtener el parámetro de consulta de la URL example.com/?Hannes...
Philipp
5

Además, si está buscando el nombre del archivo actual junto con la cadena de consulta, solo necesitará seguir

basename($_SERVER['REQUEST_URI'])

Le proporcionaría información como el siguiente ejemplo

file.php? arg1 = val & arg2 = val

Y si también desea la ruta completa del archivo a partir de la raíz, por ejemplo /folder/folder2/file.php?arg1=val&arg2=val, simplemente elimine la función basename () y simplemente use el relleno

$_SERVER['REQUEST_URI']
K. Shahzad
fuente
2
/es un carácter válido en las cadenas de consulta (consulte RFC 3986 ), por lo que no puede confiar basename.
Cairnarvon
1
Esto no funcionará si la cadena de consulta tiene una barra diagonal y, por lo tanto, es insegura. Es mejor obtener la cadena de consulta, eliminarla del final del URI de la solicitud, luego ejecutar basename (); luego, por supuesto, agregar la cadena de consulta al final.
Zenexer
4

Aquí está mi función para reconstruir partes de la cadena de consulta del REFERENTE .

Si la página que realiza la llamada ya tenía una cadena de consulta en su propia URL , y debe volver a esa página y desea devolver algunos, no todos, de esos $_GETvars (por ejemplo, un número de página).

Ejemplo: la cadena de consulta del referente estaba ?foo=1&bar=2&baz=3llamando refererQueryString( 'foo' , 'baz' )devoluciones 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
fuente
4

Este código y notación no es mía. Evan K resuelve una consulta del mismo nombre con varios valores con una función personalizada;) se toma de:

http://php.net/manual/en/function.parse-str.php#76792 Los créditos van a Evan K.

Vale la pena mencionar que parse_str incorporado NO procesa una cadena de consulta en la forma estándar CGI, cuando se trata de campos duplicados. Si existen varios campos del mismo nombre en una cadena de consulta, cualquier otro lenguaje de procesamiento web los leería en una matriz, pero PHP los sobrescribe en silencio:

<?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
fuente
3

Gracias a @K. Shahzad Esto ayuda cuando desea la cadena de consulta reescrita sin ninguna adición de reescritura. Digamos que reescribe / test /? X = y en index.php? Q = test & x = y y solo desea la cadena 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
fuente
2

Lenguaje de programación: 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'];

Esto funcionó para mí. Espero que también te ayude :)

Kamlesh
fuente
Salida: v el valor del parámetro es qnMxsGeDz90
Kamlesh
1

Para obtener cada nodo en el URI, puede usar la función explode()para $ _SERVER ['REQUEST_URI']. Si desea obtener cadenas sin saber si se pasa o no. puede usar la función que me definí para obtener parámetros de consulta de $ _REQUEST (ya que funciona tanto para los parámetros POST como 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;
}

Puede haber algunos casos en los que queremos obtener parámetros de consulta convertidos al tipo Integer, por lo que agregué el tercer parámetro a esta función.

Paul Z.
fuente