从格式如下的 URL 查询字符串中获取参数的“需要更少代码”的方法是什么?
www.mysite.com/category/subcategory?myqueryhash
输出应为:myqueryhash
我知道这种方法:
www.mysite.com/category/subcategory?q=myquery
<?php
echo $_GET['q']; //Output: myquery
?>
<?=$_GET['queryThing']?>
? - - 哦!我懂了。您的查询没有名称。
$_REQUEST["q"];
$_SERVER['QUERY_STRING']
包含您要查找的数据。
文档
php.net: $_SERVER - 手动
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
)中。
编辑
根据 PHP 文档,parse_str()
只能与第二个参数(数组)一起使用。在此 URL 上使用 parse_str($_SERVER['QUERY_STRING'])
将创建变量 $x
和 $y
,这会使代码容易受到 http://www.example.com/page.php?authenticated=1
等攻击。
parse_str
,但自然而然地,这被视为禁忌。
parse_str($_SERVER['QUERY_STRING'], $params);
-- 现在 $params
数组将包含所有查询字符串值。
如果你想要整个查询字符串:
$_SERVER["QUERY_STRING"]
我将推荐最佳答案为:
<?php
echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!';
?>
假设用户输入 http://example.com/?name=Hannes
上面的示例将输出:
你好汉内斯!
example.com/?Hannes
获取查询参数...
编程语言: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'];
这对我有用。
此外,如果您正在查找当前文件名以及查询字符串,您只需要以下内容
basename($_SERVER['REQUEST_URI'])
它会为您提供类似以下示例的信息
file.php?arg1=val&arg2=val
如果您还想要从根目录开始的文件的完整路径,例如 /folder/folder2/file.php?arg1=val&arg2=val 那么只需删除 basename() 函数并使用填充
$_SERVER['REQUEST_URI']
这个代码和符号不是我的。 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 标准的任何人来说,这可能会让人感到困惑,因此请记住这一点。作为替代方案,我使用“适当的”查询字符串解析器函数:
<?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']);
?>
这是我重建部分 REFERRER 查询字符串的函数。
如果调用页面在其自己的 URL 中已经有一个查询字符串,并且您必须返回该页面并想要发回该 $_GET
变量中的一些,而不是全部(例如页码)。
示例:推荐人的查询字符串是 ?foo=1&bar=2&baz=3
,调用 refererQueryString( 'foo' , 'baz' )
返回 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'));
感谢@K。沙赫扎德。
当您想要重写查询字符串而不需要任何重写添加时,这会有所帮助。假设您将 /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();
要获取 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 类型,因此我在此函数中添加了第三个参数。
foo=bar1&foo=bar2
这样的查询字符串,$_SERVER['QUERY_STRING']
将显示foo=bar2
print_r()
语句包装在<pre>
标记中:echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';
。