获取URL查询字符串参数

enl*_*loz 309 php url query-string

从URL查询字符串获取参数的"需要更少代码"的方法是什么,格式如下?

www.mysite.com/category/subcategory?myqueryhash

输出应该是: myqueryhash

我知道这种方法:

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

<?php
   echo $_GET['q'];  //Output: myquery
?>
Run Code Online (Sandbox Code Playgroud)

Fil*_*efp 509

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


文档

  • print_r($ _ SERVER)来查找相关值 (27认同)
  • 注意:`$ _SERVER ['QUERY_STRING']`将为查询字符串显示`foo = bar2`,如`foo = bar1&foo = bar2` (21认同)
  • 那么为什么这比使用$ _GET更好呢? (5认同)
  • 为了获得更可读的输出,可以将`print_r()`语句包装在`&lt;pre&gt;`标签中:`echo'&lt;pre&gt;'。print_r($ _ SERVER,TRUE)。'&lt;/ pre&gt;';`。 (3认同)
  • @still_dreaming_1:因为他想提取的参数没有名字(如果我正确解释了OP)。 (3认同)

med*_*ina 80

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

例:

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

完整文档在这里

  • 这实际上是基于这个问题的最佳答案.其他答案仅获取*current*URI,而问题仅指定"来自URL". (13认同)

sbr*_*bot 73

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

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

$queries = array();
parse_str($_SERVER['QUERY_STRING'], $queries);
Run Code Online (Sandbox Code Playgroud)

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

查看parse_str的文档


编辑

根据PHP文档,parse_str()应该只与第二个参数一起使用.使用parse_str($_SERVER['QUERY_STRING'])这个网址将创建变量$x$y,这使得代码容易受到诸如攻击http://www.example.com/page.php?authenticated=1.

  • ..并且是一个不应该存在的邪恶的邪恶功能. (51认同)
  • 您可以使用parse_str()的第二个参数. - `parse_str($ _ SERVER ['QUERY_STRING'],$ params);` - now` $ params`数组将包含所有查询字符串值. (42认同)
  • 你永远不应该盲目地将查询字符串参数转换为变量.如果有人使用对应于真实变量的键,您认为会发生什么?它要求利用漏洞.这就是为什么这个功能非常气馁.您可以设置PHP自动执行此操作,而无需调用`parse_str`,但很自然地,它被认为是禁止的. (26认同)
  • "你永远不应该盲目地将查询字符串参数变成变量"这样的陈述是完全荒谬的."从不" - >你怎么知道任何给定的程序员在随机工作日的随机时间会遇到什么样的情况........绝对的废话.没有"永远"这样的词.当你使用它时,任何事情都是危险的,当你正确使用它时任何事情都很有用....... 10年前很多人都在谈论IFRAME这样的事情.邪恶,绝对的愚蠢.绝对的安全风险.然后来到facebook,然后来到社交,iframe到处都没有,现在没有人这样说话.... (11认同)
  • Zenexer你能详细说明你的陈述吗?为什么这是邪恶的? (6认同)
  • *“警告:从 PHP 7.2 开始,强烈建议不要在没有第二个参数的情况下使用此函数。”* https://www.php.net/manual/en/function.parse-str.php (2认同)

Jas*_*ham 42

如果您想要整个查询字符串:

$_SERVER["QUERY_STRING"]
Run Code Online (Sandbox Code Playgroud)


use*_*325 25

我会建议最好的答案为

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

假设用户输入了http://example.com/?name=Hannes

上面的例子将输出:

你好Hannes!

  • 这是从给定查询字符串中获取变量的最快速,最简单的方法. (4认同)
  • OP 询问如何从 URL `example.com/?Hannes` 获取查询参数... (2认同)

Kam*_*esh 10

编程语言:PHP

// Inintialize a 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 the parse_str() function to parse the 
// string passed via the URL 
parse_str($url_components['query'], $params); 
    
// Display result 
echo 'v parameter value is ' . $params['v'];
Run Code Online (Sandbox Code Playgroud)

这对我有用。


aim*_*ano 6

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

http://php.net/manual/en/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');
?>
Run Code Online (Sandbox Code Playgroud)

相反,PHP 使用了一种不符合标准的做法,即在字段名中包含括号以达到相同的效果。

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

# the above produces:
$foo = array('foo' => array('1', '2', '3') );
?>
Run Code Online (Sandbox Code Playgroud)

对于习惯了 CGI 标准的任何人来说,这可能会让人感到困惑,因此请记住这一点。作为替代方案,我使用“适当的”查询字符串解析器函数:

<?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']);
?>
Run Code Online (Sandbox Code Playgroud)


K. *_*zad 5

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

basename($_SERVER['REQUEST_URI'])
Run Code Online (Sandbox Code Playgroud)

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

file.php?arg1 = val&arg2 = val

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

$_SERVER['REQUEST_URI']
Run Code Online (Sandbox Code Playgroud)

  • “ /”是查询字符串中的有效字符(请参阅[RFC 3986](http://www.ietf.org/rfc/rfc3986.txt)),因此您不能依赖于“ basename”。 (2认同)