ChatGPT解决这个技术问题 Extra ChatGPT

获取 URL 查询字符串参数

从格式如下的 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"];

t
tbc

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

文档

php.net: $_SERVER - 手动


print_r($_SERVER) 查找相关值
注意:对于像 foo=bar1&foo=bar2 这样的查询字符串,$_SERVER['QUERY_STRING'] 将显示 foo=bar2
要获得更具可读性的输出,您可以将 print_r() 语句包装在 <pre> 标记中:echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';
那么为什么这比使用 $_GET 更好呢?
@still_dreaming_1:因为他要提取的参数没有名称(如果我正确解释了 OP)。
m
medina

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

例子:

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

Full documentation here


这实际上是基于问题的最佳答案。其他答案仅获取当前 URI,而问题仅指定“来自 URL”。
s
sbrbot

函数 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)中。

documentation of parse_str

编辑

根据 PHP 文档,parse_str() 只能与第二个参数(数组)一起使用。在此 URL 上使用 parse_str($_SERVER['QUERY_STRING']) 将创建变量 $x$y,这会使代码容易受到 http://www.example.com/page.php?authenticated=1 等攻击。


..and 是一个不应该存在的邪恶、邪恶的功能。
Zenexer 你能详细说明你的陈述吗?为什么这是一个邪恶?
您永远不应该盲目地将查询字符串参数转换为变量。如果有人使用对应于实变量的键,您认为会发生什么?它要求利用。这就是为什么这个功能是非常不鼓励的。您可以将 PHP 设置为自动执行此操作,而无需调用 parse_str,但自然而然地,这被视为禁忌。
您可以使用 parse_str() 的第二个参数。 -- parse_str($_SERVER['QUERY_STRING'], $params); -- 现在 $params 数组将包含所有查询字符串值。
“你永远不应该盲目地将查询字符串参数转换为变量”这样的陈述是完全荒谬的。 “从不” -> 你怎么知道任何给定的编码员在随机工作日的随机时间会遇到什么样的情况......绝对是胡说八道。没有“从不”这样的词。当你使用错误时任何事情都是危险的,当你使用它时任何事情都是有用的...... 10年前很多人都在谈论IFRAME。邪恶的,绝对的愚蠢。绝对的安全风险。然后是 facebook,然后是社交,到处都是 iframe,现在没有人像那样说话了....
J
Jason T Featheringham

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

$_SERVER["QUERY_STRING"]

P
Peter Mortensen

我将推荐最佳答案为:

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

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

上面的示例将输出:

你好汉内斯!


这是从给定查询字符串中获取变量的最快和最简单的方法。
OP 询问如何从 URL example.com/?Hannes 获取查询参数...
K
Kamlesh

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

这对我有用。


输出:v参数值为qnMxsGeDz90
一个解释将是有序的。例如,想法/要点是什么?它与以前的答案有什么不同?请通过 editing (changing) your answer 回复,而不是在评论中(没有“编辑:”、“更新:”或类似内容 - 答案应该看起来好像是今天写的)。
K
K. Shahzad

此外,如果您正在查找当前文件名以及查询字符串,您只需要以下内容

basename($_SERVER['REQUEST_URI'])

它会为您提供类似以下示例的信息

file.php?arg1=val&arg2=val

如果您还想要从根目录开始的文件的完整路径,例如 /folder/folder2/file.php?arg1=val&arg2=val 那么只需删除 basename() 函数并使用填充

$_SERVER['REQUEST_URI']

/ 是查询字符串中的有效字符(请参阅 RFC 3986),因此您不能依赖 basename
如果查询字符串中有斜杠,这将不起作用,因此不安全。您最好获取查询字符串,将其从请求 URI 的末尾删除,然后运行 basename()——当然,然后将查询字符串添加到末尾。
D
Don't Panic

这个代码和符号不是我的。 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']);
?>

P
Peter Mortensen

这是我重建部分 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'));

P
Peter Mortensen

感谢@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();

P
Peter Mortensen

要获取 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 类型,因此我在此函数中添加了第三个参数。