요기보드3   필수기초 선택과목 요기보드 그누보드 로그인

P H P


$_GET $_POST (나중에 목차 정하면서 isset 아래로 이동하자)

GET 과 POST 는 웹프로그램에서는 아주 중요한 개념이야.
웹파일(Html 또는 PHP 파일)을 열면서 파일에게 인자(정보)를 전달하는 방식이야.

▶ $_GET
예를들어 여러분이 보고 있는 이 강좌의 상단 주소를 보면 아래와 형태의 주소가 표시되는데 여기 뿐만 아니라 네이버에서 검색을 해도, 쇼핑몰에서 검색을 할때도.. 아주 흔하게 보는 주소 형태야.

     http://yogibbs.kr/hello.php?no=31&nam=홍길동

이 방식이 바로 GET 방식이야.
위 주소줄을 해석 하자면 "http://yogibbs.kr 사이트에 접속해 hello.php 파일을 열면서 인자로 no 라는 변수에 31 을, 그리고 name 변수에 '홍길동' 이라는 값을 보내라." 는 뜻이 돼.
즉 위 주소줄로 실행되는 파일(프로그램)은 hello.php 이고 ? 뒤의 내용은 옵션이 되는 거지.

그런데 이 처럼 파일을 열면서 인자(옵션)로 정보를 보냈으면, 이것을 받는 뭔가가 있어야 겠지?
그것을 받는 역할을 하는게 PHP 에서 바로 $_GET 이야.
직접 따라해 보면서 이해해 보자구.
에디터로 아래 내용을 입력한 뒤 d.php 라는 파일로 저장해서, 웹서버에 올려봐.
- d.php

<?php
    $no = $_GET['no'];
    $name = $_GET['name'];
    echo '안녕하세요.' . $no . '번 손님 ' . $name;
?>

이제 FTP 프로그램으로 웹서버에 올렸으면 브라우저 주소줄에 아래와 같이 입력해서 설행해봐

http://웹서버주소/d.php?no=31&name=홍길동
[결과] 안녕하세요. 31번 손님 홍길동

이때 변수인 $no , $name 은 꼭 $_GET[ ] 안의 인자명과 같은 필요는 없어. $aa , $bb 라고 해도 돼.
그러나 $_GET[ ] 안의 인자명은 꼭 주소 줄에서 보낸 인자명과 같아야 겠지?
위 코드를 해석하자면 "no=31 로 넘어온 값을 $_GET['no'] 로 받아서 $no 변수에 넣고,
name=홍길동 으로 넘어온 값을 $_GET['name'] 로 받아서 $name 변수에 넣은 뒤 echo 로 출력해라."

만일 주소줄에 인자옵션을 넣지 않고 그냥 아래와 같이 d.php 만 실행하면 어떻게 될까?

웹서버주소/d.php
[결과] 안녕하세요. 번 손님

no, name 값을 받지 못했으니 위와 같이 나오겠지?
그런데 웹프로램에 따라 이 인자값이 아주 중요한 경우가 있어.
인자가 반드시 들어와야 아래 쪽 코드가 정상적으로 처리하는 경우도 있을거 아냐.
인자 값이 제대로 왔는지 확인하기 위해서는 바로 위에서 배운 isset() 또는 empty() 를 사용하면 돼.

위 d.php 코드를 다음과 같이 변경하고 다시 실행해 봐.

<?php
    if (!isset($_GET['no']) || !isset($_GET['name'])) {
        echo '번호와 이름을 입력해서 실행해 주세요';
    } else {
        $no = $_GET['no'];
        $name = $_GET['name'];
        echo '안녕하세요.' . $no . '번 손님 ' . $name;
    } 
?>

isset() 앞의 ! (느낌표)는 "NOT , 반대, ~이 아니면" 을 뜻하는 부호야.
또 중간의 || 기호는 "또는 OR " 를 뜻하는 부호야. (AND 는 && 기호를 사용하고)
|| && 대신에 직접 OR AND 라고 사용해도 돼. 앞의 if 를 공부할 때 봤지?

그러니 위 if 문은 GET 방식으로 들어온 정보중에 "no 변수가 없거나 또는 name 변수가 없으면. ." 이라는 조건이 되겠지?
d.php 뒤에 인자로 번호와 이름 둘 중 하나라도 입력하지 않으면 "번호와 이름을 입력해서 실행해 주세요" 라는 메시지를 출력하는 거야.

그런데 여기서 번호(no)는 꼭 필요한데, 사용자가 아래와 같이 주소를 입력했다고 생각해봐.

d.php?no=0&name=홍길동 또는 d.php?no=&name=홍길동
[결과] 안녕하세요. 0번 손님 홍길동

이것은 조건문에 걸리지 않고 안녕하세요.. 라는 인사를 출력해.
왜냐하면 no 라는 GET 변수명은 들어 오긴 했잖아. 값이 없을 뿐이지.
그래서 GET 변수명이 있느냐 뿐만 아니라, 값이 있느냐 까지 검사하려면 empty() 함수로 검사해야 해.
위 코드를 아래와 같이 변경하면 되겠지?

<?php
    if (empty($_GET['no']) || empry($_GET['name'])) {
        echo '번호와 이름을 입력해서 실행해 주세요';
    } else {
        $no = $_GET['no'];
        $name = $_GET['name'];
        echo '안녕하세요.' . $no . '번 손님 ' . $name;
    } 
?>

어느 때 isset() 을 사용하고, 어느때 empty() 를 사용하느냐는 그때 그때의 상황에 따라 다를 수 있어.
일단 isset() 은 "변수자체가 있느냐?" 를 체크하고, empty() 는 "값이 있느냐?" 라고 생각해 두고 그때의 상황에 따라 사용하면 될거야.

▶ $_POST
PHP 파일을 실행하면서 정보를 전달하는 방법에 POST 방식이라는 것도 있어.
GET 방식은 브라우저의 주소줄을 통해서 정보를 전달하는데 반해, POST 방식은 안보이게 숨겨서 전달하는 방식이야.
<form> 화면에서 <input> 태그에 입력한 글을 보낼 때 주로 사용하는 방식이야.

PHP로 간단한 로그인 화면을 만들어서 확인해 볼까?
에디터로 아래 내용을 입력해서 e.php 파일을 만들고 웹서버로 올려서 실행해 봐.

- e.php

<?php
    $id = $_POST['id'];
    $pw = $_POST['pw'];
    if ($id != '' && $pw != '') {
        echo '입력한 정보는 다음과 같습니다.<br>';
        echo '아이디 : ' . $id . '<br>';
        echo '비번 : ' . $pw;
        exit;
    }
?>
<form method='post' action="e.php">
    아이디 :  <input type="text" name="id">
    비번 : <input type="password" name="pw">
  <button type="submit" name="submit">로 그 인</button> 
</form>	

아래 <form> 화면을 보면 method='post'로 되어 있지?
바로 입력한 내용을 post 방식으로 보내라는 뜻이야.
어디로? action='e.php' 로 써 두었어. 실행한 파일과 같아. 즉 다시 나에게 오라는 뜻이야.
(물론 다른 파일로 보낼 수도 있어. f.php 라고 쓰고 [로그인]을 누르면 f.php 파일을 실행하겠지?)

이제 브라우저에서 주소줄에 e.php 를 입력해서 실행하면 첫줄 부터 검사하며 내려 갈거야.
그런데 처음 실행했을 때는 POST 로 넘겨준 값이 없으니까 $id 도 없고, $pw 도 아무것도 없어.
아래줄의 if 조건문을 봐.

if ($id != '' && $pw != '')

이전 학습인 IF 조건문 배울 때 != 는 "같지 않으면" 이라고 배웠지?
그러니 위 조건문을 해석하면 다음과 같아.
$id 값이 null('') 이 아니고(!=), $pw 값도 null('')이 아니면 아래 echo 를 출력해라...

그런데 처음 e.php 를 실행해서 들어 올 때는 아이디, 비번이 비어 있었으니 당연히 이 자리는 건너 뛰고 if { } 절 아래로 내려 가서 <form> 화면을 보여주게 되는거야.

이제 여기서 아이디, 비번을 입력하고 [로그인] 버튼을 누르면 그때 action="e.php" 에 따라 e.php 를 다시 실행하면서 POST 로 값을 보내게 돼.
그럼 다시 e.php 가 재실행되면서
  1. 아이디. 비번이 POST 로 왔으면 이 값을 받아서,
  2. 이번에는 둘 다 값이 있으면 if 조건에 맞으니 echo 로 아이디, 비번을 화면에 출력하고,
  3. exit 명령을 만나면 그 아래는 무시하고 e.php 를 끝내.
PHP 에서 exit 명령은 현재 실행중인 PHP 파일을 종료하라는 명령이야.
그러므로 (3)번까지 오면 exit 자리에서 e.php를 끝내므로 그 아래에 있던 <form> 화면은 출력하지 않아.

또 만일 (2)번에 왔을때 아이디, 비번 중에 하나를 입력하지 않고 [로그인]을 눌렀다면 if 조건에 맞지 않으니 echo 나 exit 를 실행하지 않고 아래로 내려가 <form> 화면을 다시 출력할거야.

위 코드를 조금 더 다음어 볼까?
e.php 를 아래와 같이 수정하고 다시 실행해봐.


<?php
if (isset($_POST['submit'])) {
    $id = $_POST['id'];
    $pw = $_POST['pw'];
    if ($id != '' && $pw != '') {
        echo '입력한 정보는 다음과 같습니다.<br>';
        echo '아이디 : ' . $id . '<br>';
        echo '비번 : ' . $pw;
        exit;
    }
    echo '<h3>아이디와 비번을 입력하세요</h3>';
}
?>
<form method='post' action="e.php">
    아이디 :  <input type="text" name="id">
    비번 : <input type="password" name="pw">
  <button type="submit" name="submit">로 그 인</button> 
</form>	

<form> 화면 위쪽을 통째로 if (isset($_POST['submit'])) 조건문으로 묶었어.
해석하면 "submit 이라는 변수가 POST 방식으로 들어 온게 있으면..." 이 되겠지?
즉 처음에 브라우저에서 e.php 주소를 입력해 들어 오면 isset($_POST['submit']) 는 조건에 안맞아(false).
그러면 바로 아래쪽 <form> 화면을 출력하겠지.
아이디, 비번을 입력하고 [로그인]을 클릭해서 다시 e.php 로 들어온 것이면, isset($_POST['submit']) 이 true 가 될것이고 이 조건문 안의 코드들을 실행할거야.

그리고 그 안의 if ($id != '' && $pw != '') 에 맞지 않으면 "echo '<h3>아이디와 비번을 입력하세요</h3>'" 를 보여주고 계속 아래로 내려가 <form> 화면을 다시 보여 주겠지?

이번 학습은 쬐끔 어려웠지?
위와 같은 코드의 흐름은 나중에 '요기보드'의 소스를 보면 수도 없이 반복 될테니 걱정하지 마.
우선 여기서는 GET 과 POST 의 차이를 아는 것 만으로도 충분해.


목차제 목조회
129
132
126
113
148
106
111
99
102
107
114
121
111
116