홈으로 | 무료회원가입 | 아이디/비번찾기
추천음악방송
GET에 대한 긴 이야기...
12년 전
이번엔 복습하는 의미에서 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방식으로 값을 넘기는게 보이시죠?
보이신다면 -_,-/ 성공하신 겁니다...
추천추천 : 328 추천 목록
번호 제목
3,035
 아이프레임(iframe) 비율 유지하면서 크기 조절하는 방법
3,034
 PHP 배열에서 무작위로 하나 뽑아주는 array rand() 함수
3,033
 PHP 정규식 정리
3,032
 PHP 정규식을 활용한 태그 및 특정 문자열 제거 및 추출 방법
3,031
 php 크롤링 또는 파싱 함수, 정규식 모음
3,030
 제이쿼리 기본 명령어
3,029
 웹페이지 가로 모드세로 모드 인식하기
3,028
 모바일 웹 화면 강제 회전(가로모드 고정)
3,027
 [HTML5]에서 frameset 대체 방법과 iframe 속성
3,026
 HTML <Audio> 사용법
3,025
 윈도우10 시스템파일 손상 (초간단 오류 복구방법!!)
3,024
 PHP 파일 존재 여부 파악하기(로컬 파일 존재 및 원격지 파일 존재)
3,023
 [CSS] 박스 세로 가운데 중앙 정렬 6가지
3,022
 CSS Layout 수평 & 수직 정렬
3,021
 여러 도메인들 간 쿠키 공유하기
3,020
 태그 사이에 있는 텍스트를 추출
3,019
 [JQuery] textbox focus on off일때 숫자 콤마 보여주기
3,018
 쿠키 생성,가져오기,삭제
3,017
 사용자 함수 모음
3,016
 마우스,키보드 제한 ( 오른쪽클릭,드래그,영역선택등..)
3,015
 [HTML5] <video> - DOM으로 제어하기
3,014
 HTML5 video 태그에서 영상 좌우반전
3,013
 PHP - 특정 태그 및 문자열 추출, 제거
3,012
 [PHP] define과 defined의 차이
3,011
 우클릭 완벽차단 스크립트
목록
뮤직트로트 부산광역시 부산진구 가야동 ㅣ 개인정보취급방침
Copyright (C) musictrot All rights reserved.