회원가입아이디/비번찾기
홈으로

GET에 대한 긴 이야기...
13년 전
이번엔 복습하는 의미에서 GET으로 값을 넘기는 방법에 대해 좀 따져보고 넘어가겠습니다.

일단 아래 소스 하나만 만들어 보죠...

<?=$string?>

간단하죠?

파일이름은 test.php로 저장하시고요..
실행을 해보면 화면에 아무것도 출력되지 않을 것 입니다.
정상이죠 그게...

(-_-a 그냥 주소창에 test.php와 같이 적으시면 안됩니다....
http://localhost/test.php라든가;;; 뭐 그렇게...)

이제 주소창에 아래와 같이 적어보도록 하죠...

test.php?string=abcd

뭐가 출력되죠?
abcd가 출력되면 정상입니다.

풀이를 해보면 ? 뒤에 string이라는 것이 변수명이 되고...
= 뒤에 붙여준 abcd가 그 값이 되는 것 입니다.
여러개의 변수를 전달해 주려면 아래와 같이 &로 연결 합니다.

test.php?string=abcd&string2=efgh

만약 아무것도 출력되지 않는 다면...
windows디렉토리의 php.ini파일을 메모장으로 열어서 다음 단어를 찾아 보세요

register_globals

찾으신 부분에 아래와 같이 되어 있다면...
abcd가 출력되지 않았을 것입니다.

register_globals=off

register_globals라는 것은 GET,POST,COOKIE와 같은 변수들을
(보통 요놈들 셋을 GPC라 부릅니다)
바로 변수로 표현해 주느냐 그렇지 않느냐의 차이인데요...
일반적으로 ASP나 JSP에서는 우리가 $string이라고 바로 표현을 하지 못하고
request어쩌구 하면서 값을 요청하고 받아다 쓰는데요...
php에서는 이런것들 다 무시하고...
(대충 감 잡으셨겠지만 php는 대부분의 복잡한 문법들은 다 무시해 버리고 있습니다)
바로 변수명을 쓸수 있도록 해주는데...
그럴려면 register_globals라는 옵션이 사용중이어야 한다는 것이죠...
그래도 궁금하신분은 사전찾아서 register와 globals의 뜻을 찾아보시고 연구해 보시구요...

어쨌든 register_globals가 on이어야 변수값을 그대로 사용 할 수 있다는 것인데...
웹호스팅을 받고 있는 입장이라 요놈을 on으로 할수 없다 할 경우에는 어떻게 가져오느냐....

test.php?string=abcd

위와 같이 string이라는 변수를 넘겨주었다면...
아래와 같이 받아올 수가 있습니다.

<?=$HTTP_GET_VARS[string]?>

쉽죠?
앞에 붙은 =에 대해서 물으시는 분이 없기를...
궁금하셨던 분들 계시죠? -_-;;

암튼 결론은 $HTTP_GET_VARS라는 배열의 원소로 string이라는 변수가 들어갔다는 것인데요...
그것도 귀찮은지 아래와 같이 하셔도 됩니다.

<?=$_GET[string]?>

물론 아래와 같이 해도 됩니다.

<?=$_GET["string"]?> 또는 <?=$_GET['string']?>

-_-a다른언어에서는 이렇게 따옴표 같은걸 무시하면 바로 에러 납니다...

<?
$string=$_GET[string];
echo $string;
?>

위와 같이 값을 $string이라는 변수에 저장해서 출력해도 되겠죠...
위와 같이 가져다 쓰는 방법은 register_globals가 on이든 off든 상관없이 다 사용 가능합니다.
그러니 php설정에 문제 되지 않게 하려면 마지막 방법과 같이 쓰는게 제일 낫다는 거겠죠..
$string에 저장하지 않고 바로 $_GET[string]과 같이 쓰면 어떠냐 하시는 분들도 계시겠지만...
-_-a길면 귀찮자나요...

그리고 이왕 쓰는거 $HTTP_GET_VARS로 쓰시는게 좋습니다.
예전 버전에서는 $_GET를 지원 하지 않기 때문이죠...

같은 방법으로 POST로 넘어온 변수는 $HTTP_POST_VARS 또는 $_POST
쿠키는 $HTTP_COOKIE_VARS와 같이 가져다 쓸수 있습니다.
업로드된 파일은 $HTTP_POST_FILES로 되고요...

그런데...여기서 문제는...
변수가 한 500개 넘어왔다고 가정해보죠...

-_-a 막막 하시죠?

그래서 아래와 같은 프로그램을 만들어 본적이 있습니다.

1. <?
2. $key=array_keys($_GET);
3. $key_size=sizeof($key);
4.
5. for($i=0;$i<$key_size;$i++)
6. {
7. $key_name=$key[$i];
8. $$key_name=$_GET[$key_name];
9. }
10. ?>

페이지 호출은 아래와 같이 했다고 하죠..

test.php?a=A&b=B

뭔고 하니...

2번째 줄에서는 GET으로 넘어온 배열의 키이름을 모두 뽑아서 $key라는 배열에 저장합니다.

a와 b라는 변수가 넘어왔으니...
$_GET[a]와 $_GET[b]가 되겠죠...
요놈들이 $key[0]=a , $key[1]=b 이렇게 들어간다 그겁니다.
결국 $key배열의 값들은 넘어온 변수들의 이름이 됩니다.

3번째줄에서는 $key배열의 크기를 구합니다.
배열의 원소 갯수를 구한다는 얘기인데요...
여기서는 2가 되겠죠...
그걸 $key_size에 저장하고 5번째줄에서는...
0부터 $key배열 원소의 갯수인 $key_size보다 1작을 때 까지 루프를 돌립니다.
여기서 $key_size는 2이기 때문에...
0부터 1까지 $i값이 증가하면서 루프가 돌겠죠...

7번째 줄을 볼까요?
$key[$i]는 현재 $i가 0이기 때문에 $key[0]됩니다.
그리고 $key[0]은 a였죠...
결국 $key_name의 값으로 a가 들어간다는 것입니다.

그럼 마지막으로 8번째 줄을 보죠...

$_GET[$key_name];를 따져보자면....

$key_name은 a였죠?
그러므로 $_GET[a]가 되는 거죠...
$_GET[a]의 값인 A가 되는 것입니다.

그럼 $$key_name의 값은 A라는 얘기인데...
(-_-오타 아닙니다 $가 두개예요...)

$key_name은 a였고 앞에 $가 붙었으니...
결국 $a라는 변수를 말하는 것이 됩니다.

-_-;;무슨 이런경우가 다 있느냐 하시겠지만...
php에선 됩니다...

정리해보면 $a="A" 라는 결론이 나옵니다.
우리가 원하던 결과죠...
루프가 한번 더 돌면 $i가 1이 되면서...
$b="B"가 될겁니다...-_,-


그런데 사실 요것도 다 필요 없고요...
아래와 같이 해주시면 간단합니다.

<?
extract($_GET);
?>

(__)죄송;;;

어쨌든...
그냥 저렇게 손수 만들어 쓸수 있다는 것을 보여드리기 위해서;;;


자 그럼 다시 GET에 대한 얘기로 넘어와보죠...

문제 입니다.
string이란 변수에 &=?란 값을 넣어서 test.php문서에 GET방식으로 전달해보세요...

정답은?

test.php?string=&=?

이건가요?;;;-_-a;;;

지금까지 제대로 읽어오신분이라면...
좀 의아해 하시겠죠...
?, &, = 는 값을 넘기기 위해 사용되는 문자인데...
이걸 넘기자니 제대로 넘어가는지 원...

일단 한번 해보세요...
아무것도 출력이 안된다면 정상입니다.

따져보죠...
string= 이후에 $string변수의 값을 넣어야 하는데...
&가 나오면서 string변수의 값은 끝나고 다른 변수를 넘기는 것으로 간주하게 됩니다.
그 이후에는 =?가 나오는데...
요건 -_-a뭐 해석이 안되겠죠...

이럴경우에 url인코딩이라는 것을 사용 합니다.
url을 인코딩해서 요론 특수 문자라든지...
한글과 같은 문자들을 escape시킬수 있습니다. (-.-사전찾아보세요)

php에서는 urlencode라는 함수와 urldecode라는 함수가 있는데요...
아래와 같이 사용 합니다.

$변수 = urlencode("값");

값으로 넣어진 문자를 인코딩하여 $변수에 저장하는 것이죠...
일단 아래와 같이 해보도록 하죠...

<?
$a=urlencode("&=?");
echo $a;
?>

결과는?

%26%3D%3F

위와 같이 나옵니다.
이것은 &=?를 url인코딩 한 결과 인데요...
이것을 아래와 같이 값에 넣어주면 된다는 것이죠...

test.php의 소스는 젤 처음에 했던 것처럼
<?=$string?>으로 해두시고...

test.php?string=%26%3D%3F

위와 같이 호출해 보세요.
-_,-뭐가 뜹니까?

브라우저 주소창으로 넘어온 것은 지금에서와 같이...
자동으로 디코딩 됩니다만...
이것을 php상에서 디코딩 하려면...

urldecode라는 함수를 사용해야 합니다.
사용법은 urlencode와 같고요...


마지막으로 한가지 잘못된 고정관념에 대해 짚고 넘어가자면...
GET은 POST에 비해서 넘겨줄수 있는 값의 양이 작다 라는 것인데요...
실제로 웹브라우저의 URL창에 적을 수 있는 주소의 길이는 256자 였습니다.

test.php? <--몇자 입니까?

9자 입니다.

-_-라고 대답하신 분들이 안계시기를....

http://localhost/test.php? 정도까지는 생각을 하셔야죠..-_,-

어쨌든 이제 몇자 남았죠?
뭐 한 200몇자 남았겠죠...
(-_-;;뭘 세고 계십니까?)

뭐...많은 양의 데이터를 넘기기엔 좀 힘든 길이죠...

그런데 최근에 이 제한이 2048자 까지 늘었답니다.
그건 아래 문서를 잘 읽어 보시고요...

http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q208/4/27.ASP&NoWebContent=1
영어니까 -_-a보실분만 조용히...
(-.-솔직히 2048이 맞는지 모르겠습니다...순 영어라서;;;)


위의 주소에서도 GET방식으로 값을 넘기는게 보이시죠?
보이신다면 -_,-/ 성공하신 겁니다...
추천추천 : 358 추천 목록
번호 제목
2,885
input 입력 필드 앞뒤 공백 실시간 제거
2,884
Placeholder 포커스시 감추기
2,883
MySQL 중복된 데이터를 삭제
2,882
MySQL 중복 데이터 확인
2,881
sessionStorage.getItem 와 sessionStorage.setItem
2,880
제이쿼리 랜덤으로 배경색 변경
2,879
preg match에 관한 정규식
2,878
Stream an audio file with MediaPlayer 오디오 파일 스트리밍 하기
2,877
Audio Streaming PHP Code
2,876
PHP $ SERVER 환경 변수 정리
2,875
Vimeo (비메오) API 를 사용하여 플레이어 컨트롤하기
2,874
iframe 사용시 하단에 발생하는 공백 제거방법
2,873
아이프레임(iframe) 전체화면 가능하게 하기
2,872
부트스트랩(bootstrapk)에서 사용하는 class명 정리
2,871
부트스트랩 CSS
2,870
크롬에서 마진 조절
2,869
PHP 현재 페이지의 도메인명이나 url등의 정보 알아오기
2,868
PHP preg match all()
2,867
PHP 로 웹페이지 긁어오기 모든 방법 총정리!
2,866
[PHP] 원격지 파일 주소 노출 안하고 curl로 다운로드 받기
2,865
PHP 함수 정리
2,864
아이프레임(iframe) 비율 유지하면서 크기 조절하는 방법
2,863
PHP 배열에서 무작위로 하나 뽑아주는 array rand() 함수
2,862
PHP 정규식 정리
2,861
PHP 정규식을 활용한 태그 및 특정 문자열 제거 및 추출 방법
2,860
php 크롤링 또는 파싱 함수, 정규식 모음
2,859
제이쿼리 기본 명령어
2,858
웹페이지 가로 모드세로 모드 인식하기
2,857
모바일 웹 화면 강제 회전(가로모드 고정)
2,856
[HTML5]에서 frameset 대체 방법과 iframe 속성
목록
뮤직트로트 부산광역시 부산진구 가야동 ㅣ 개인정보취급방침
Copyright ⓒ musictrot All rights reserved.