URL 쿼리 문자열 매개 변수 가져 오기


322

다음과 같은 형식의 URL 쿼리 문자열에서 매개 변수를 가져 오는 "필요한 코드가 적은"방법은 무엇입니까?

www.mysite.com/category/subcategory?myqueryhash

출력은 다음과 같아야합니다. myqueryhash

이 접근법을 알고 있습니다.

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

<?php
   echo $_GET['q'];  //Output: myquery
?>

답변:


527

$_SERVER['QUERY_STRING'] 찾고있는 데이터를 포함합니다.


선적 서류 비치


28
print_r ($ _ SERVER) 관련 값 찾기

22
참고 : 다음 과 같은 쿼리 문자열 $_SERVER['QUERY_STRING']을 표시 foo=bar2합니다.foo=bar1&foo=bar2
Timo

3
더 읽기 쉬운 출력을 얻으려면 print_r()명령문을 <pre>태그로 묶을 수 있습니다 echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
Amal Murali

1
@RJAnoop이 경우, qstring은 URL의 일부이므로 URL의 $_SERVER['REQUEST_URI']해당 부분을 변수로 전달하기 위해 mod_rewrite를 사용하는 것이 좋습니다. stackoverflow.com/questions/16388959/url-rewriting-with-php
nullability

5
그렇다면 왜 $ _GET을 사용하는 것보다 낫습니까?
still_dreaming_1

91

PHP를 사용하는 방법 은 URL을 구문 분석하고 해당 구성 요소를 반환하는 parse_url 함수를 사용하는 것입니다 . 쿼리 문자열을 포함합니다.

예:

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

여기에 전체 문서


15
이것은 실제로 질문에 근거한 가장 좋은 답변입니다. 다른 답변은 현재 URI 만 가져 오고 질문은 "URL에서"만 지정합니다.
크리스 해리슨

80

이 함수는 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의 문서를 보십시오


편집하다

PHP 문서에 따르면 parse_str(), 두 번째 매개 변수 만 사용해야합니다. 사용하여 parse_str($_SERVER['QUERY_STRING'])변수를 생성합니다이 URL에서 $x$y같은 공격에 취약 코드를 만드는, http://www.example.com/page.php?authenticated=1.


52
.. 존재해서는 안되는 사악하고 사악한 기능입니다.
Zenexer

6
Zenexer 당신은 당신의 진술을 좀 더 정교하게 할 수 있습니까? 이것이 악한 이유는 무엇입니까?
sbrbot

26
쿼리 문자열 매개 변수를 맹목적으로 변수로 바꾸면 안됩니다. 누군가가 실제 변수에 해당하는 키를 사용하면 어떻게 될까요? 익스플로잇을 요구하고 있습니다. 따라서이 기능을 사용하지 않는 것이 좋습니다. 을 호출하지 않고 PHP가 자동으로이 작업을 수행하도록 설정할 수 parse_str있지만 당연히 no-no로 간주됩니다.
Zenexer

42
parse_str ()의 두 번째 매개 변수를 사용할 수 있습니다. -- parse_str($_SERVER['QUERY_STRING'], $params);이제 $params배열은 모든 쿼리 문자열 값을 포함합니다.
Amal Murali 5

13
"조회 문자열 매개 변수를 맹목적으로 변수로 바꾸어서는 안된다"이러한 문장은 완전히 터무니 없다. "Never"-> 임의의 근무 시간 중 임의의 근무 시간에 특정 코더가 어떤 상황을 경험하는지 어떻게 알 수 있습니까? 'never'와 같은 단어는 없습니다. 잘못 사용하면 아무것도 위험합니다. 올바르게 사용하면 모두 유용합니다 .... 10 년 전 많은 사람들이 IFRAME에 대해 그렇게 이야기했습니다. 사악하고 절대적인 어리 석음. 절대적인 보안 위험. 그때 페이스 북에 와서 사회에 와서 iframe을 도처에
보냈고


25

나는 최고의 답변을 추천합니다

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

사용자가 http://example.com/?name=Hannes를 입력했다고 가정

위의 예는 다음과 같이 출력됩니다.

하네스 안녕하세요!


4
주어진 쿼리 문자열에서 변수를 가져 오는 가장 빠르고 쉬운 방법입니다.
Mirko Brunner

2
OP는 URL에서 쿼리 매개 변수를 얻는 방법을 물었습니다 example.com/?Hannes.
Philipp

5

또한 쿼리 문자열과 함께 현재 파일 이름을 찾고 있다면 다음과 같이하면됩니다.

basename($_SERVER['REQUEST_URI'])

다음 예제와 같은 정보를 제공합니다.

file.php? arg1 = val & arg2 = val

그리고 루트에서 시작하여 파일의 전체 경로를 원할 경우 (예 : /folder/folder2/file.php?arg1=val&arg2=val) basename () 함수를 제거하고 채우기를 사용하십시오.

$_SERVER['REQUEST_URI']

2
/는 쿼리 문자열에서 유효한 문자 ( RFC 3986 참조 )이므로 의지 할 수 없습니다 basename.
Cairnarvon

1
쿼리 문자열에 슬래시가 있으면 작동하지 않으므로 안전하지 않습니다. 쿼리 문자열을 가져 와서 요청 URI의 끝에서 제거한 다음 basename () 실행 하는 것이 좋습니다. 물론 쿼리 문자열을 끝에 추가하십시오.
Zenexer 2016 년

4

다음은 REFERRER 쿼리 문자열 일부를 다시 작성하는 함수 입니다.

호출 페이지에 이미 자체 URL 에 쿼리 문자열이 있고 해당 페이지로 돌아가서 해당 $_GETvars 의 일부 (예 : 페이지 번호)를 다시 보내려고 하는 경우

예 : 리퍼러의 쿼리 문자열이 returns 를 ?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'));

4

이 코드와 표기법은 내 것이 아닙니다. Evan K는 다음과 같이 사용자 정의 함수를 사용하여 다중 값 동일한 이름 쿼리를 해결합니다.

http://php.net/manual/en/function.parse-str.php#76792 크레딧은 Evan K로 이동합니다.

parse_str 내장은 필드를 복제 할 때 CGI 표준 방식으로 쿼리 문자열을 처리하지 않는다고 언급합니다. 같은 이름의 여러 필드가 쿼리 문자열에 존재하는 경우 다른 모든 웹 처리 언어는이를 배열로 읽지 만 PHP는 자동으로 해당 필드를 덮어 씁니다.

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

3

@K에게 감사합니다. Shahzad 다시 쓰기를 추가하지 않고 다시 쓴 쿼리 문자열을 원할 때 도움이됩니다. / 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();

2

프로그래밍 언어 : PHP

// Inintialize 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 parse_str() function to parse the 
// string passed via URL 
parse_str($url_components['query'], $params); 

// Display result 
echo 'v parameter value is '.$params['v'];

이것은 나를 위해 일했습니다. 희망, 그것은 또한 당신을 도울 것입니다 :)


출력 : v 매개 변수 값은 qnMxsGeDz90입니다
Kamlesh

1

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

쿼리 매개 변수를 정수 유형으로 변환하려는 경우가있을 수 있으므로이 함수에 세 번째 매개 변수를 추가했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.