什么是“更少的代码所需”的方式,以获得参数从一个URL查询字符串的格式如下?
www.mysite.com/category/subcategory ? myqueryhash
输出应该是:myqueryhash
我知道这种做法:
www.mysite.com/category/subcategory?q=myquery
<?php
echo $_GET['q']; //Output: myquery
?>
什么是“更少的代码所需”的方式,以获得参数从一个URL查询字符串的格式如下?
www.mysite.com/category/subcategory ? myqueryhash
输出应该是:myqueryhash
我知道这种做法:
www.mysite.com/category/subcategory?q=myquery
<?php
echo $_GET['q']; //Output: myquery
?>
当前回答
此外,如果您正在与查询字符串一起查找当前文件名,则只需要以下内容
basename($_SERVER['REQUEST_URI'])
它将为您提供如下示例的信息
file.php吗?__arg1 = val&arg2 =瓦尔
如果你还想要文件的完整路径,以及从根目录开始,例如/folder/folder2/file.php?Arg1 =val&arg2=val然后只是删除basename()函数,只是使用填充
$_SERVER['REQUEST_URI']
其他回答
PHP的方法是使用parse_url函数,该函数解析URL并返回其组件。包括查询字符串。
例子:
$url = 'www.mysite.com/category/subcategory?myqueryhash';
echo parse_url($url, PHP_URL_QUERY); # output "myqueryhash"
完整的文档在这里
函数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的文档
EDIT
根据PHP文档,parse_str()只能与第二个参数(数组)一起使用。在这个URL上使用parse_str($_SERVER['QUERY_STRING'])将创建变量$x和$y,这使得代码容易受到诸如http://www.example.com/page.php?authenticated=1之类的攻击。
这些代码和符号不是我的。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');
?>
相反,PHP使用了一种非标准兼容的实践,即在字段名中包含括号,以达到相同的效果。
<?php
# bizarre php-specific behavior
parse_str('foo[]=1&foo[]=2&foo[]=3');
# the above produces:
$foo = array('foo' => array('1', '2', '3') );
?>
这可能会让任何习惯CGI标准的人感到困惑,所以请记住它。作为替代,我使用了一个“合适的”querystring解析器函数:
<?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']);
?>
如果你想要整个查询字符串:
$_SERVER["QUERY_STRING"]
要获取URI中的每个节点,可以使用函数explosion () For $_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类型,因此我在此函数中添加了第三个参数。