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.