获取URL查询字符串参数


322

从格式如下的URL查询字符串中获取参数的“较少代码”方法是什么?

www.mysite.com/category/subcategory?myqueryhash

输出应为: myqueryhash

我知道这种方法:

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

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

Answers:


527

$_SERVER['QUERY_STRING'] 包含您要查找的数据。


文件资料


28
print_r($ _ SERVER)查找相关值

22
注意:$_SERVER['QUERY_STRING']将显示foo=bar2查询字符串,例如foo=bar1&foo=bar2
Timo Huovinen

3
要获得更具可读性的输出,可以将print_r()语句包装在<pre>标记中:echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';
2014年

1
@RJAnoop在这种情况下,qstring是URL的一部分,因此您可以使用$_SERVER['REQUEST_URI'],尽管您可能要考虑使用mod_rewrite将URL的该部分作为变量传递。参见stackoverflow.com/questions/16388959/url-rewriting-with-php
nullability 2014年

5
那为什么比使用$ _GET更好呢?
still_dreaming_1

91

PHP的实现方法是使用函数parse_url,该函数解析URL并返回其组件。包括查询字符串。

例:

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

完整的文档在这里


15
这实际上是根据问题得出的最佳答案。其他答案仅获取当前 URI,而问题仅指定“来自URL”。
克里斯·哈里森

80

该函数parse_str()自动将所有查询参数读入数组。

例如,如果URL为http://www.example.com/page.php?x=100&y=200,则代码

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

会将参数存储到$queries数组($queries['x']=100$queries['y']=200)中。

查看parse_str的文档


编辑

根据PHP文档,parse_str()仅应与第二个参数一起使用。parse_str($_SERVER['QUERY_STRING'])在此URL上使用会创建$x$y,从而使代码容易受到诸如的攻击http://www.example.com/page.php?authenticated=1


52
..and是不应该存在的邪恶的,邪恶的功能。
Zenexer

6
Zenexer您可以再详细说明一下吗?为什么这是邪恶的?
sbrbot

26
您永远不要盲目地将querystring参数转换为变量。如果有人使用与实变量相对应的键,您会怎么办?它要求漏洞利用。这就是为什么不建议使用此功能的原因。您可以将PHP设置为自动执行此操作,而无需调用parse_str,但是自然地,这被认为是不可以的。
Zenexer

42
您可以使用parse_str()的第二个参数。-- parse_str($_SERVER['QUERY_STRING'], $params);现在$params数组将包含所有查询字符串值。
阿马尔·穆拉利

13
“永远不要盲目地将querystring参数转换为变量”。这样的陈述是完全荒谬的。“从不”->您怎么知道任何给定的编码器在随机工作日的随机小时内会遇到什么样的情况……..绝对是胡说八道。没有“从不”这样的词。如果错误使用任何内容都是危险的,正确使用任何内容都是有用的.... 10年前,很多人都在谈论有关IFRAME的话题。邪恶,绝对的愚蠢。绝对的安全风险。然后是Facebook,然后是社交网站,到处都是iframe,现在没有人在谈论那样……
。– unity100



5

另外,如果您要查找当前文件名以及查询字符串,则只需执行以下操作

basename($_SERVER['REQUEST_URI'])

它将为您提供信息,例如以下示例

file.php?arg1 = val&arg2 = val

而且,如果您还希望从根目录开始也要有完整的文件路径,例如/folder/folder2/file.php?arg1=val&arg2=val,则只需删除basename()函数,然后使用fillowing

$_SERVER['REQUEST_URI']

2
/是查询字符串中的有效字符(请参阅RFC 3986),因此您不能依赖basename
Cairnarvon 2015年

1
如果查询字符串中包含斜杠,则此方法将不起作用,因此不安全。最好获得查询字符串,将其从请求URI的末尾删除,然后运行basename(),然后再将查询字符串添加到末尾。
Zenexer 2015年

4

这是我的函数,用于重建REFERRER的查询字符串的一部分。

如果调用页面已经在其自己的URL中具有查询字符串,则您必须返回到该页面并想发回部分(而不是全部)该$_GET变量(例如,页码)。

示例:引荐来源网址的查询字符串正在?foo=1&bar=2&baz=3调用refererQueryString( 'foo' , 'baz' )return 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'));

4

此代码和符号不是我的。Evan K使用自定义函数解决了多值同名查询;)来自:

http://php.net/manual/zh-CN/function.parse-str.php#76792 版权归Evan K所有。

值得一提的是,当涉及重复字段时,内置的parse_str不会以CGI标准的方式处理查询字符串。如果查询字符串中存在多个相同名称的字段,则其他所有Web处理语言都会将它们读入数组,但是PHP会默默地覆盖它们:

<?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']);
?>

3

感谢@K。Shahzad当您希望重写的查询字符串而不添加任何重写内容时,这会有所帮助。假设您将/ test /?x = y重写为index.php?q = test&x = y并且只希望查询字符串。

function get_query_string(){

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

2

编程语言: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'];

这对我有用。希望对您有所帮助:)


输出:v参数值为qnMxsGeDz90
Kamlesh,

1

要获取URI中的每个节点,可以explode()对$ _SERVER ['REQUEST_URI'] 使用函数。如果要获取字符串而不知道是否传递了字符串。您可以使用我自己定义的函数从$ _REQUEST获取查询参数(因为它同时适用于POST和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;
}

在某些情况下,我们希望将查询参数转换为Integer类型,因此我在此函数中添加了第三个参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.