ChatGPT解决这个技术问题 Extra ChatGPT

Get URL query string parameters

What is the "less code needed" way to get parameters from a URL query string which is formatted like the following?

www.mysite.com/category/subcategory?myqueryhash

Output should be: myqueryhash

I am aware of this approach:

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

<?php
   echo $_GET['q'];  //Output: myquery
?>
Isn't that the least code needed already? <?=$_GET['queryThing']?> ? --- OH! I see. Your query has no name.
$_REQUEST["q"];

t
tbc

$_SERVER['QUERY_STRING'] contains the data that you are looking for.

DOCUMENTATION

php.net: $_SERVER - Manual


print_r($_SERVER) to find related values
note: $_SERVER['QUERY_STRING'] will show foo=bar2 for query string like foo=bar1&foo=bar2
To get a more readable output, you can wrap the print_r() statement in <pre> tags: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
So why is this better than using $_GET?
@still_dreaming_1: Because the parameter he wants to extract has no name (if I interpret the OP correctly).
m
medina

The PHP way to do it is using the function parse_url, which parses a URL and return its components. Including the query string.

Example:

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

Full documentation here


This is actually the best answer based on the question. The other answers only get the current URI whereas the question only specifies "from URL".
s
sbrbot

The function parse_str() automatically reads all query parameters into an array.

For example, if the URL is http://www.example.com/page.php?x=100&y=200, the code

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

will store parameter values into the $queries array ($queries['x']=100, $queries['y']=200).

Look at documentation of parse_str

EDIT

According to the PHP documentation, parse_str() should only be used with a second parameter (array). Using parse_str($_SERVER['QUERY_STRING']) on this URL will create variables $x and $y, which makes the code vulnerable to attacks such as http://www.example.com/page.php?authenticated=1.


..and is an evil, evil function that should not exist.
Zenexer can you elaborate your statement a bit more? WHy this is an evil?
You should never blindly turn querystring parameters into variables. What do you think happens if someone uses a key that corresponds to a real variable? It's asking for exploits. That's why this feature is highly discouraged. You can set PHP to do this automatically, without calling parse_str, but naturally, it's considered a no-no.
You can use the second parameter of parse_str(). -- parse_str($_SERVER['QUERY_STRING'], $params); -- now $params array will contain all the query string values.
"You should never blindly turn querystring parameters into variables" Such statements are totally absurd. "Never" -> how do you know what kind of situations any given coder will experience on a random hour of a random workday........ Absolute nonsense. There is no such word as 'never'. ANYTHING is dangerous when you use it wrong, ANYTHING is useful when you use it right....... 10 years ago a lot of people were talking like that regarding IFRAMEs. evil, absolute stupidity. absolute security risk. then came facebook, then came social, iframes everywhere and noone is talking like that now....
J
Jason T Featheringham

If you want the whole query string:

$_SERVER["QUERY_STRING"]

P
Peter Mortensen

I will recommend the best answer as:

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

Assuming the user entered http://example.com/?name=Hannes

The above example will output:

Hello Hannes!


This is the fastest and easiest way to get the vars from the given query string.
The OP asked how to get the query param from URL example.com/?Hannes...
K
Kamlesh

Programming Language: 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'];

This worked for me.


Output: v parameter value is qnMxsGeDz90
An explanation would be in order. E.g., what is the idea/gist? How is it different from previous answers? Please respond by editing (changing) your answer, not here in comments (without "Edit:", "Update:", or similar - the answer should appear as if it was written today).
K
K. Shahzad

Also if you are looking for current file name along with the query string, you will just need following

basename($_SERVER['REQUEST_URI'])

It would provide you info like following example

file.php?arg1=val&arg2=val

And if you also want full path of file as well starting from root, e.g. /folder/folder2/file.php?arg1=val&arg2=val then just remove basename() function and just use fillowing

$_SERVER['REQUEST_URI']

/ is a valid character in query strings (see RFC 3986), so you can't rely on basename.
This won't work if the querystring has a slash in it, and is therefore insecure. You're better off obtaining the querystring, removing it from the end of the request URI, then running basename()--then, of course, add the querystring onto the end.
D
Don't Panic

This code and notation is not mine. Evan K solves a multi value same name query with a custom function ;) is taken from:

http://php.net/manual/en/function.parse-str.php#76792 Credits go to Evan K.

It bears mentioning that the parse_str builtin does NOT process a query string in the CGI standard way, when it comes to duplicate fields. If multiple fields of the same name exist in a query string, every other web processing language would read them into an array, but PHP silently overwrites them:

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

P
Peter Mortensen

Here is my function to rebuild parts of the REFERRER's query string.

If the calling page already had a query string in its own URL, and you must go back to that page and want to send back some, not all, of that $_GET vars (e.g. a page number).

Example: Referrer's query string was ?foo=1&bar=2&baz=3 calling refererQueryString( 'foo' , 'baz' ) returns 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

Thanks to @K. Shahzad.

This helps when you want the rewritten query string without any rewrite additions. Let’s say you rewrite the /test/?x=y to index.php?q=test&x=y and you only want the query string.

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

For getting each node in the URI, you can use function explode() for $_SERVER['REQUEST_URI']. If you want to get strings without knowing if they are passed or not, you may use the function I defined myself to get query parameters from $_REQUEST (as it works both for POST and GET parameters).

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;
}

There might be some cases when we want to get query parameters converted into Integer type, so I added the third parameter to this function.