생활코딩

Coding Everybody

입출력 그리고 폼과 HTTP

토픽 생활코딩 > 언어 > PHP

이번 시간에는 PHP 에플리케이션에 데이터를 입력하는 방법을 알아본다. 그리고 폼을 이용해서 사용자로부터 데이터를 전송 받는 방법도 알아 볼 것이다. 이를 통해서 할 수 있는 일은 후속 수업인 조건문 편에서 알아본다.

에플리케이션의 입력값과 폼

프로그램은 입력 값을 가질 수 있다. 그리고 입력 값에 따라서 동작 방법이 달라지거나 입력된 값을 저장/삭제/출력 할 수 있다. 이번 시간에는 PHP의 문법에 대한 내용에서 잠깐 빠져나와서 PHP 에플리케이션이 데이터를 입력 받는 방법에 대해서 알아본다.

우선 코드를 보자.

<?php
echo $_GET['id'];
?>

위의 코드를 브라우저로 열어보자. 이 때 파일명 뒤에 ?id=k8805이라고 입력한다. 예를들면 아래와 같다.

결과는 k8805다. URL의 k8805를 egoing으로 변경해보자. 화면에는 egoing이 출력될 것이다. 이것을 통해서 유추할 수 있는 것은 코드 상의 $_GET['id']는 URL의 내용 중에서 '?id=' 뒤에 따라오는 데이터로 치환된다는 것을 추정 할 수 있다.

이것이 의미하는 것은 PHP 에플리케이션은 URL을 통해서 데이터를 입력 받을 수 있다는 것이다. 지금까지 우리가 살펴본 PHP 에플리케이션들은 그 결과 값이 항상 같았다. 사용자와 상호작용하지 않는 프로그램이었다는 뜻이다. (불편하기는 하지만) 우리는 URL을 통해서 데이터를 입력 받을 수 있고, 그 입력 받은 값에 따라서 다른 결과를 출력하는 프로그램을 만들 수 있게 된 것이다. 기쁘지 아니한가?

조금 더 복잡한 아래 코드를 보자.

<?php
echo $_GET['id'].','.$_GET['password'];
?>

위의 코드로 만들어진 에플리케이션이 http://localhost/IO_form/2.php라고 한다면 URL을 아래와 같이 만들어서 주소창에 입력해보자.

localhost/IO_form/2.php?id=k8805&password=111111

결과는 k8805,111111 일 것이다. 값을 바꿔보자. 출력 값이 달라질 것이다. 이를 통해서 추정 할 수 있는 것은 $_GET['password']의 값은 URL의 내용 중 '&password=' 뒤의 데이터라는 것을 알 수 있다. 위의 내용은 아래와 같이 정리해 볼 수 있다.

'?'는 에플리케이션 2.php와 데이터를 구분해주는 구분자다.

'&'는 값과 값을 구분해주는 구분자다.

'='는 값과 값 사이의 구분자다.

이렇게 해서 PHP 에플리케이션으로 데이터를 전송하는 방법을 알아봤다. 데이터를 받은 에플리케이션은 데이터의 값에 따라서 다르게 동작 할 수도 있고, 다른 내용을 표시할 수도 있다. 또한 해당 정보를 파일이나 데이터베이스에 저장 할 수도 있다.

HTML Form

그런데 URL에 직접 정보를 입력하는 것은 불편하다. 그래서 고안된 방법이 HTML의 폼이다. 코드를 보자. form에 대한 자세한 설명은 HTML 수업을 참고하자.

<html>
<body>
    <form method="get" action="2.php">
		id :  <input type="text" name="id" />
		password :  <input type="text" name="password" />
		<input type="submit" />
	</form>
</body>
</html>

form이란 사용자가 입력한 정보를 받아서 서버로 전송하기 위한 HTML의 태그이다. 사용자가 입력한 정보를 받는 UI를 입력 컨트롤이라고 하는데 위의 코드에는 id와 password를 입력 받는 입력 컨트롤이 포함되어 있다. 입력 컨트롤에 입력된 정보는 해당 컨트롤의 속성 name의 값을 이름으로 데이터가 서버로 전송된다.

정보 입력을 마치면 사용자가 입력한 정보를 서버로 전송할 수 있도록 해야하는데 그 때 사용하는 컨트롤이 submit 버튼이다. 사용자가 submit 버튼을 누르면 입력 컨트롤에 입력된 정보는 form 태그의 action 속성에 지정된 URL로 전송된다. 이 때 method에 지정된 방식에 따라서 get/post 방식으로 데이터가 전송된다. 위에서 살펴본 URL에 데이터를 첨부해서 전송하는 방식을 GET 방식이라고 부르고, POST 방식은 HTTP 메시지의 본문에 데이터를 포함해서 전송한다.

GET VS POST 방식

get 방식으로 데이터를 전송할 때 URL에 데이터를 포함시키는 것이 비해서 POST 방식으로 데이터를 전송할 때는 전송하는 데이터를 URL에 포함시키지 않고 전송 할 수 있다. 이러한 차이로 인해서 GET 방식은 정보에 대한 링크로 많이 사용되고, POST 방식은 사용자의 아이디나 비밀번호와 같은 데이터를 전송하는 방식으로 주로 사용한다.

<html>
<body>
    <form method="POST" action="4.php">
		id :  <input type="text" name="id" />
		password :  <input type="text" name="password" />
		<input type="submit" />
	</form>
</body>
</html>
<?php
echo $_POST['id'].','.$_POST['password'];
?> 

전송된 데이터의 처리

form 태그의 action 속성의 URL이 가르키는 에플리케이션은 사용자가 전송한 데이터를 받는다. 그리고 그 정보를 간단하게는 위에서 살펴본 예제처럼 화면에 출력 할 수도 있고, 데이터베이스에 저장할 수도 있다. 이에 대한 구체적인 방법은 후속 수업인 조건문에서 알아본다. 이번 수업은 조건문의 전초전이라고 생각하자.

댓글

댓글 본문
  1. 너구리님
    너무 재밌어서 회원가입해서 댓글남깁니다.
    2023.12.27 수강완료했습니다.
  2. DreamBoy
    2023.10.21. PHP - 입출력 그리고 폼과 HTTP 파트 수강했습니다.
  3. 코딩혁명
    감사합니다~
  4. dueto park
    2022.06.28. 입출력과 폼, http 수강 완.
  5. 코드파괴자
    22.05.19 Form, Get / Post Complete.
  6. 늘랑파파
    get post 완료
  7. 드림보이
    2022.01.14. 입출력 그리고 폼과 HTTP 파트 수강완료
  8. ggyuker
    21.12.30 수강완료
  9. jeisyoon
    2021.07.25 입출력과 폼, HTTP - OK
  10. diabullet
    강의 너무 완벽.. 사랑해여
  11. 자바바
    HTML에서 배웠던 form 이 get과 post 로 PHP에서 이렇게 연결되어 있네요.....~!~!
  12. 조성호
    2021.01.01 완료
    감사합니다.
  13. jslee
    가입정보가 어떻게 전달되고 있는지 확실히 배우고 갑니다...
  14. choon
    감사합니다.
  15. 바봉봉
    get과 post는 모두 서버에서 처리합니다.
    get은 넘겨주는 데이터를 URL에 포함시키므로 결과페이지의 URL에서 확인할 수 있습니다.
    예) http://opentutorials.org......111
    post는 넘겨주는 데이터를 숨겨서 보내기 때문에 결과페이지의 URL에서 확인할 수 없습니다.
    예) http://opentutorials.org/2.php
    따라서, 중요한 정보들은 get이 아니라 post로 보내야겠죠... 패스워드 등이 노출되면 안되니..

    모두 강의에 포함된 내용이니 다시 한 번 복습하시기를 추천합니다.
    대화보기
    • NotFound
      강의 잘보고 있습니다. get 방식과 post 방식의 차이를 보니까 get은 서버에서 클라이언트로 html 코드를 넘겨주는방식이고 post는 html 코드를 실행한 결과를 주는거 같은데 그렇다면 get은 클라이언트가, post는 서버가 코드를 처리한다고 봐도 되나요?
    • Sungwoong Pyeon
      아래 w3school 웹페이지에 들어 가셔서 HTML 과 CSS를 추가 하셔서 egoing님이 설명해주신 데로 직접 해보는 걸 추천합니다. 조금만 코드를 분석하면 2.php 페이지에 정보를 출력하실수 있을겁니다.
      https://www.w3schools.com......asp
    • 서한결
      주소창에 파일 경로로 뜨시는 분들
      그리구 파일 소스가 그대로 뜨시는 분들
      html파일의 action 부분을 <form method="get" action="http://localhost/폴더명/파일명.php">로 고쳐주시면 되요!!
    • htmlhm
      php 앱 만들 때 가끔 "페이지가 작동하지 않습니다.
      현재 localhost에서 요청을 처리할 수 없습니다.
      HTTP ERROR 500"이 웹 화면에 뜹니다.
    • 질문있습니다.
      Notice: Undefined index: id in C:\Apache24\htdocs\IO_form\25.php on line 2
      비교 까지 하고 여기 넘어왔는데 첫영상부터 못따라 가고 있어요 ㅠㅠ
      멀 빠뜨린걸까요??
      25.php
      <?php
      echo $_GET['id'];
      ?>
      이렇게 입력하는거 아닌가요?ㅠㅠ
    • HongJu Shin
      질문 있습니다.
      get 방식에서 php 페이지가 정상적으로 작동했었습니다.
      하지만 post 방식에서는
      Notice: Undefined index: id in C:\Bitnami\wampstack-7.1.13-1\apache2\htdocs\php\variable\11.php on line 2
      Notice: Undefined index: password in C:\Bitnami\wampstack-7.1.13-1\apache2\htdocs\php\variable\11.php on line 2
      란 에러가 나타났었습니다.
      바꾼건 get 방식 코드에서 method를 post로 바꾸고 #_GET['id']를 $_POST['id]로 하고 name은 건들지 안 았었습니다.
      여러가지 시도를 하다가 apache를 다시 restart하고 나니 정상적으로 나타납니다.
      왜 이런 현상이 일어났는지 궁금합니다.
      감사합니다.
    • 띠링
      피들러 화면에서 인코딩에 gzip이라고 돼 있는 건 사용자가 작성한 데이터가 압축되어 전송된다는 뜻인가요?
    • 질문있어요!
      안녕하세요! php 수업을 따라가고 있는 학생입니다. 다름이 아니라 위의 코드 예시를 실행하게 되어 submit 버튼을 누르면 다음과 같은 주소로 가게되어 file:///C:/Bitnami/wampstack-7.1.12-0/apache2/htdocs/2.php 입력했던 패스워드와 아이디가 표츌이 되지 않습니다. 이러한 경우 어떻게 해야되나요? ㅠㅠ
    • 비전문가
      저도 같은 증상이라서 검색도 해보고 수정도 해보고 별짓 다해봤는데요.
      결국 문제는 간단했었습니다.
      아피치나 톰캣등으로 웹서버가 운영중인 상태에서 ex)locahost/로 시작해야 동작이 되더군요
      웹서버가 정상적으로 동작중인지 확인해보세요
      대화보기
      • Bong Bong
        잘 보고 있습니다.

        html, css 강좌는 어렵지 않게 따라 왔습니다만, php에서 문제가 생기네요.

        get vs. post방식의 마지막 코드를 실행했을때, 결과 화면에 소스코드가 그대로 보입니다.

        htdoc의 phpinfo 화면은 정상적으로 보이는데, 예제의 html 화면에서 버튼을 누르면
        <?php
        echo $_POST['id'].','.$_POST['password'];
        ?>
        이렇게 소스가 그대로 뜨네요.

        그런데 결과 화면의 주소창을 보면 file:///D:/~~~/post.php 이렇게 뜹니다.
        이 주소를 localhost://~~/post.php로 넣어주면, php가 작동하면서 , 만 보이는것 같습니다.

        구글링을 통해 여러가지 조치를 취해도 마찬가지입니다.
      • dosamo
        완료
      • jjung
        잘 보고 있습니다~
      • 엽스
        잘보고 있습니다. 감사합니다.
      • 다시시작
        완료
      • 고스트프리
        감사합니다.
      • 종훈
        대화보기
        • orez
          텍스트로 설명이 붙어있어서 복습하기에 매우 좋습니다. 항상 감사합니다.
        • spiritord
          감사합니다
        • sheis
          잘 봤어요^^
        • kimjs9105
          감사합니다~~ 강의 다 보고 http 한번 더 보러 오겠습니다~~~~~~
        • 카이리
          2017.7.16 PHP Start 1st day to here.
        • 심화평
          네트워크,TCP/IP,HTTP 나중에 공부.
          17-07-11 감사합니다~
          html수업에서 들은거 복습한거 같네요
        • 오원구
          쉬운 설명에 잘 이해하며 배우고 있습니다.
          고맙습니다.
        • 브로콜린
          와 ... 정말 http가 뭔지도 몰랐고
          GET, POST방식도 몰랐는데...
          진짜 깔끔하게 설명해주셨어요 감사합니다! ㅠㅠ
        • 긍정아빠
          = index.php =

          <!DOCTYPE html>
          <html lang="ko">
          <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>php</title>
          <style>
          #loginBox {
          list-style-type:none;
          margin:0; padding:0;
          }
          </style>
          </head>
          <body>
          <form action="action.php" method="get">
          <fieldset>
          <legend>회원로그인</legend>
          <ul id="loginBox">
          <li>
          <label for="id">아이디</label>
          <input type="text" name="id" />
          </li>
          <li>
          <label for="pwd">패스워드</label>
          <input type="text" name="pwd" />
          </li>
          <li><input type="submit" value="전송" /></li>
          </ul>
          </fieldset>

          </form>
          </body>
          </html>

          = action.php =

          <!DOCTYPE html>
          <html lang="ko">
          <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>회원로그인</title>
          </head>
          <body>
          <?php
          echo $_GET['id']."님 환영합니다";
          echo '<br />';
          echo "입력하신 아이디는".$_GET['id']."이고";
          echo '<br />';
          echo "입력하신 패스워드는".$_GET['pwd']."입니다";
          ?>
          </body>
          </html>

          대충 만들어봤는데 재밌습니다...PHP도 배워볼까하다가 어려워보여서 안했는데..영상보면서 하니 되는군요!
          HTML도 대충 찾아서 넣어봅니다. action.php도 HTML로 작성해야지 보기좋을거같긴합니다.
          너무 감사합니다. 일단 자신감이 생겨요!
        • studystudy
          깔끔한 설명이 좋네요 ㅎㅎ
        • Jo Sejin
          너무너무감사드려요 진짜..
        • 김세창
          너무 재미있게 봤습니다.
          늘고맙습니다 . 17.03.29
        • hosts
          경로 지정 안되시는 분들은 hosts 파일 127.0.0.1 (localhost)로 도메인 잡아주시고
          apache 폴더 내 httpd.conf 파일 손대주시면 편안하게 되실겁니다...
          강의 잘 듣고있습니다! 감사합니다! 정말 설명 잘하시네요
        • funlife
          감사합니다.
        • 신입1
          감사합니다
        • 차카타파
          http://localhost......ce/ 이 주소로 해보시면 되지 않을까요?
          html 파일을 그냥 브라우저로 열어서 그런것 같은데요
          대화보기
          • once
            html에서 다음과 같이 data를 넘겨주는데

            <form action="test.php" method="get">

            제가 기대한 url은
            http://localhost......=26
            인데,

            실제로는 이렇게 나와버리네요. 서버가 아니라 파일 address를 사용해버리는 것 같은데 왜이러는 걸까요??ㅠㅜfile:///C:/Program%20Files%20(x86)/Apache%20Software%20Foundation/Apache2.2/htdocs/Practice/catch.php?name=lee&age=26

            php, apache 모두 문제없이 돌아갑니다.ㅠㅜ
          • JustStudy
            고맙습니다
          • 웹프로그래머
            처음 웹 공부를 할때에 외우는 식으로 해서 코딩을 할때에도 무작정 코딩을 하다보니 이해가 안가는 부분이 많았는데 이 강의를 보고나서 이해를 하다보니 코딩에 더욱더 자신이 생기게 되었습니다. 감사합니다!^^