Obtener cadena de consulta URL


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

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
?>
Author: Peter Mortensen, 2011-12-12

10 answers

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


DOCUMENTACIÓN

 469
Author: Filip Roséen - refp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-09 08:59:51

La forma PHP de hacerlo 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í

 63
Author: medina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 22:25:10

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á 'x' = 100 e 'y' = 200 en $queries.

Mira documentación de parse_str


EDITAR

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

 52
Author: sbrbot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-09 07:56:57

Si desea toda la cadena de consulta:

$_SERVER["QUERY_STRING"]
 39
Author: Jason T Featheringham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-12 03:58:42

Recomendaré la mejor respuesta como

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

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

El ejemplo anterior mostrará:

Hola Hannes!

 21
Author: user3816325,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-19 16:49:33

También si está buscando el nombre del archivo actual junto con la cadena de consulta, solo necesitará lo siguiente

basename($_SERVER['REQUEST_URI'])

Le proporcionaría información como el siguiente ejemplo

Archivo.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 entonces simplemente elimina la función basename() y solo usa fillowing

$_SERVER['REQUEST_URI']
 4
Author: K. Shahzad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-02 08:44:25

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

Si la página que llama ya tenía una cadena de consulta en su propia URL , y debe regresar a esa página y desea enviar algunos, no todos, de esos $_GET vars (por ejemplo, un número de página).

Ejemplo: La cadena de consulta del referente era ?foo=1&bar=2&baz=3 llamando a refererQueryString( 'foo' , 'baz' ) devuelve 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'));
 3
Author: Adriana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-10 19:58:13

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 definí para obtener parámetros de consulta de $_REQUEST (ya que funciona tanto para POST como para GET params).

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 en tipo Entero, por lo que agregué el tercer parámetro a esta función.

 1
Author: Paul Z.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-09 13:51:33

Este código y notación no son míos. Evan K resuelve una consulta multi valor del mismo nombre 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.

Cabe mencionar que el builtin parse_str NO procesa una cadena de consulta en la forma estándar CGI, cuando se trata de duplicar campos. Si existen varios campos del mismo nombre en una cadena de consulta, cualquier otro lenguaje de procesamiento web leería en un array, pero PHP los sobrescribe 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']);
?>
 1
Author: aimiliano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-08 23:17:03

Gracias a @K. Shahzad Esto ayuda cuando desea que la cadena de consulta reescrita sin ninguna adición de reescritura. Digamos que reescribes el / test/?x = y al índice.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();
 1
Author: Sjaak Wish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-25 14:41:24