개념 및 사용 방법
parse_str()
함수는
URL에서 사용할 수 있는 형식으로 인코딩된 쿼리 문자열을 디코딩하여 변수로 구문 분석하는데 사용하는 함수입니다.
이 함수는 결과를 반환하는 대신, 두 번째 인자로 전달된 변수에 구문 분석한 데이터를 배열 형태로 저장합니다.
주로 http_build_query()
함수로 인코딩 된 쿼리 문자열을 디코딩하여 변수로 구문 분석하는데 사용합니다.
http_build_query()
함수는
배열 또는 객체를 URL에서 사용할 수 있는 형식으로 인코딩하여 쿼리 문자열을 생성하는 함수입니다.
기본 예제
// URL에서 사용할 수 있는 문자열 형식으로 인코딩할 배열
$data = array(
'name' => 'John Doe',
'age' => 30,
'city' => 'New York'
);
// http_build_query() 함수를 사용하여 쿼리 문자열로 인코딩
$queryString = http_build_query($data);
echo $queryString; // 출력: name=John+Doe&age=30&city=New+York'
// parse_str() 함수를 사용하여 디코딩
// 구문 분석한 데이터를 두 번째 인자인 $decodedArray에 배열 형태로 저장
parse_str($queryString, $decodedArray);
print_r($decodedArray); // 출력: Array ( [name] => John Doe [age] => 30 [city] => New York )
parse_str()
함수는 URL에서 사용할 수 있는 형식으로 인코딩된 쿼리 문자열을 디코딩하여 변수로 구문 분석하는데 사용하는 함수입니다. 주로 http_build_query()
함수로 인코딩된 URL 쿼리를 디코딩합니다. http_build_query()
함수는 주로 배열을 URL 쿼리 문자열로 변환할 때 사용되며, parse_str()
함수는 디코딩하는 역할을 합니다.
parse_str()
함수는 http_build_query()
함수로 인코딩된 URL 쿼리 문자열을 디코딩하여 키-값 쌍으로 변환하고, 이를 배열 또는 변수에 할당합니다.
따라서, parse_str()
함수와 http_build_query()
함수는 서로 반대되는 역할을 수행한다고 할 수 있습니다.
구문
parse_str(string $string, array &$result): void
매개변수
$string |
디코딩하려는 인코딩된 URL 문자열입니다. |
---|---|
&$result |
이 매개변수를 설정하면 디코딩된 키-값 쌍이 저장될 배열입니다. 참조 변수입니다. |
반환 값
반환 값이 없습니다.
변경 이력
PHP 7.2부터 매개변수가 없으면 parse_str()
함수를 사용하는 것이 권장되지 않습니다. 이는 이 방식의 사용이 보안상 위험할 수 있기 때문입니다. 악의적인 사용자가 URL 인코딩된 쿼리 문자열에 삽입한 코드가 실행될 수 있습니다.
더욱이, PHP 8.0.0 버전부터는 &$result
매개변수가 필수로 지정되어야 하므로, 이 함수를 사용할 때 반드시 &$result
매개변수를 제공해야 합니다.
주의하세요!
두 번째 매개변수를 사용하지 않고 이 함수를 사용하는 것은 매우 권장되지 않으며, PHP 7.2 버전부터는 비권장(DISCOURAGED)되며, PHP 8.0.0 버전부터는 두 번째 매개변수 &$result
가 필수입니다.
PHP 버전 | 설명 |
---|---|
8.0.0 | &$result 매개변수는 더 이상 옵션이 아니라 필수 매개변수입니다. |
7.2.0 | 두 번째 매개변수 없이 parse_str() 를 사용하는 경우 E_DEPRECATED 알림을 발생시킵니다. |
권장 방법과 비권장 방법
parse_str()
함수는 URL 쿼리 문자열(예: name=John+Doe&age=30
)을 PHP 변수로 분석하는 데 사용됩니다. 하지만 이 함수는 어떻게 사용하느냐에 따라 권장되는 방법과 비권장되는 방법으로 나뉩니다. 안전하고 예측 가능한 코드를 위해선 권장 방법을 사용하는 것이 매우 중요합니다.
비권장 방법: 두 번째 인자를 생략하기
parse_str()
함수에 두 번째 인자는 생략하고 쿼리 문자열만 넘겨주는 방식입니다.
$query_string = 'name=John+Doe&age=30';
// 비권장 방법: 결과를 저장할 배열 인자를 생략
parse_str($query_string);
// $name과 $age 변수가 현재 스코프에 직접 생성됩니다.
echo '이름 (비권장 방법): ' . $name . '<br>'; // 출력: '이름 (비권장 방법): John Doe'
echo '나이 (비권장 방법): ' . $age; // 출력: '나이 (권장 방법): 30'
왜 비권장될까요?
- 코드를 읽는 사람이
parse_str()
함수 때문에 어떤 변수가 갑자기 생겨났는지 한눈에 알기 어렵습니다. - 이미 코드에
$name
이라는 변수가 있는데parse_str()
때문에 또 다른$name
변수가 생겨서 기존 변수 값을 덮어쓸 수도 있습니다. - PHP 7.2.0부터는 이렇게 사용하는 방식에 대해 경고(
E_DEPRECATED
)가 뜨기 시작했고, PHP 8.0.0부터는 아예 에러(&$result
매개변수 필수)가 나서 작동하지 않습니다.
권장 방법: 두 번째 인자로 배열 전달하기
parse_str()
함수에 쿼리 문자열과 함께 구문 분석된 결과를 저장할 배열 변수를 두 번째 인자로 넘겨주는 방식입니다.
$query_string = 'name=John+Doe&age=30';
// 권장 방법: 결과를 $parsed_data 배열에 저장
$parsed_data = []; // 결과를 저장할 배열을 미리 선언하는 것이 좋습니다.
parse_str($query_string, $parsed_data);
// 파싱된 데이터는 $parsed_data 배열 안에 있습니다.
$name = $parsed_data['name'];
$age = $parsed_data['age'];
echo '이름 (권장 방법): ' . $name . '<br>'; // 출력: '이름 (권장 방법): John Doe'
echo '나이 (권장 방법): ' . $age; // 출력: '나이 (권장 방법): 30'
왜 권장될까요?
- 구문 분석된 모든 결과가 지정된 하나의 배열 안에 캡슐화되므로, 외부 입력이 코드 내의 다른 변수를 마음대로 생성하거나 덮어쓰는 것을 원천적으로 방지합니다.
- 코드를 읽을 때
parse_str()
의 결과가$parsed_data
라는 특정 배열에 저장된다는 것을 바로 알 수 있어서 코드의 흐름을 이해하기 쉽습니다. - 변수 이름 충돌 걱정 없이 항상 일관된 방식으로 데이터에 접근할 수 있어 유지보수가 용이합니다.
- PHP 8.0.0 이후 버전에서도 문제없이 작동하는 유일하고 올바른 사용 방법입니다.
같이 보기
- PHP urlencode() 함수 – 문자열을 URL 인코딩
- PHP rawurlencode() 함수 – RFC 3986에 따른 URL 인코딩
- PHP http_build_query() 함수 – 배열 또는 객체를 URL 인코딩하여 쿼리 문자열 생성
- PHP urlencode()로 인코딩된 URL 디코딩 – urldecode() 함수
- PHP rawurlencode()로 인코딩된 URL 디코딩 – rawurldecode() 함수
- PHP URL 인코딩 함수 비교
- PHP URL 디코딩 함수 비교
- PHP preg_split() 함수 - 개념 정리 및 사용 예제
- PHP parse_url() 함수 - URL 구성 요소 분석