PHP

입출력 그리고 폼과 HTTP

이번 시간에는 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. 신입1
    감사합니다
  2. 차카타파
    http://localhost......ce/ 이 주소로 해보시면 되지 않을까요?
    html 파일을 그냥 브라우저로 열어서 그런것 같은데요
    대화보기
    • 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
      고맙습니다
    • 웹프로그래머
      처음 웹 공부를 할때에 외우는 식으로 해서 코딩을 할때에도 무작정 코딩을 하다보니 이해가 안가는 부분이 많았는데 이 강의를 보고나서 이해를 하다보니 코딩에 더욱더 자신이 생기게 되었습니다. 감사합니다!^^
    • PHP수업 다 보고 정리차 함 더 보고 있는데,
      fiddler라는 프로그램을 좀 더 살펴보니 이거이거 상당히 유용할것 같습니다. 감사합니다.
    • 진돌
      시간 가는 줄 모르고 재미있게! 봤습니다.
    • 보안은 철저히
    • 2015-11-16월요일
      html5 공부할때 폼 액션이 무엇인지 모르고 그냥 #을 넣었었는데 이런 기능이었군요
    • 코딩!
      로그인은 POST
      게시글은 GET !
    • 쥬슈야
      감사합니다. 명쾌합니다.
    • <?php
      echo $_GET['id'];
      ?>
      에서
      <?php
      echo $_GET['name'];
      ?>
      으로 바꾸고 나서 웹 주소에서는 여전히 ?id 라고하면 에러메세지가 나타나지 안고 welcome,만 나옵니다.
      이것이 예전에 php.ini-dist.php에서 에러메세지 출력여부를 설정 할 때,
      error_reporting = -1 로 해주라고 하셨는데,
      제 것은 기본값이
      error_reporting = E_ALL & ~E_NOTICE 로 되어있어서 무슨말인지 몰라 그냥 내비두었습니다.(나머지 값은 개발자 설정으로 바꿈[모든 에러메시지 on])
      혹시 저부분이 문제가 되는지 궁금합니다.
    • ㅠㅠ
      쿼리 전송을 눌렀는데 브라우저가 안열리고 파일다운로드 팝업창이 뜨네요
      열기 누르니깐 php파일이 열리구요ㅜㅜ
      뭐가문젠지모르겠네요
    • 로탱
      정말 좋은 강의에요. 독학보다는 설명을 듣는 쪽이 좋아서 멘토찾느라 애먹었는데...감사합니다!
    • nancy
      fiddler web debugger 진짜 좋은 툴인것 같아요 예전에는 구글 자체 달린 디버깅하는 기능을 사용하였는데

      이제 fiddler web debugger 를 알아버려구요 ^ ^ 감사합니다.
    • 새치머리
      늦은 나이에 공부해야 하는 심란했는데 넘 이해하기 쉽게 만들어 주셔서 감사합니다.^^

      앞으로 많은 도움이 될 것 같습니다.
    • 육점이
      감사합니다 !!! 내일 이어서 php 공부해야겠어요!!
    • 동구라미
      초보인데 너무 고마운자료네요~ ^^ 덕분에 원하는 걸 만들 수 있습니다. 감사합니다.
    • 김명순
      이고잉님 화이팅이에요~
    • HLEE
      해결했습니다.

      file:/// 이 아니라 http:/// 로 되어있어야 했네요.

      같은 오류 있으신 분들 참고하세요.
      대화보기
      • HLEE
        Mac (10.10) 환경에서 MAMP (BITNAMI) 설치 후 .php 확장자로 강좌대로 코딩하여 htdocs 디렉토리에 저장하여 웹 브라우저로 열었는데, 소스가 그대로 출력됩니다. 구글링을 해 보니 php.ini 의 short_open_tag 설정값을 변경하라는 조언이 있어서 그렇게 하였는데도 변화가 없네요. 혹시 이에 관해서 아시는 바가 있으신지요?
      • Jane Yang
        get 방식과 post 방식에 대한 궁금증이 시원하게 풀렸어요.
        명쾌한 강의 항상 감사드립니다.
      • 행복부자
        이번 인강 보는 중에 마지막 부분에 클리앙 페이지 등장하니까 무지 반갑네요. ^^
      • 염준호
        잘보았습니다^^
      • mvc모델을 공부하면서 헷갈리는게 생겼는데...

        controller와 view는 이와 같이 입력한 값을 받아들일 때 어떻게 구분해야 하는거죠??

        여기서는 기본 html파일을 controller라고 보고, echo를 쓴 php파일을 view라고 보는 건가요??

        아니면 입력값을 받고 submit하는 화면도 view로 따로 구분해야 하나요?

        그런 구분은 순수 php에서 가능한가요? 불가능하다면 CI에서는 가능한가요?
      • 휘빈a
        설명 정말 잘 이해되네요
      • 제이슨
        고맙습니다. 불금 그것도 날이 바뀌어 토요일이 되었지만, 일마치고 들어와서 하루 한번씩 듣는 수업이 너무 좋습니다.
      • 너무 좋은 강의 입니다...실용적 예제가 기대되요
      • wkdjj
        좋은 강의 감사합니다 ^^
      • 히시기
        좋은 강의 감사합니다!!!
      • ennmen
        강의 계속 보고 있는데 좋은 강의 올려주세서 너무 감사합니다.
      • 별모모
        [ 궁금 ] php 코드가 같은 문서 내에 있을 수도 있다고 했는데, 같은 페이지에 있다면 어떻게 되나요?

        [정리] php코드를 별도의 php페이지를 만들지 않고, 폼페이지에 넣으려면 폼페이지에 넣고 action="현재 페이지 url"을 넣어줍니다. 현재 페이지 URL은 그냥 비워두거나, # 이나 $PHP_SELF로 표시할 수 있다고 하는데, 코드실습 페이지(http://ideone.com/5ZA7Px)에서는 확인하지 못했습니다. 다만, $PHP_SELF는 PHP메뉴얼(Function 라이브러리)에서 확인하지 못했습니다.

        페이스북 생활코딩 그룹에서 이성광 님, 이고잉 님, 한다현 님께 도움을 받았습니다. 고맙습니다.
      • Brownieforme
        보는데도 이렇게 시간이 오래 걸리는데
        만들땐 얼마나 오래 걸렸을까 싶어요.
        그래도 시간 가는줄 모르고 강의 들었습니다.

        감사합니다.
      • 금산
        감사합니다.
        구문에 약간의 에러가 있은듯합니다.
        대화보기
        • egoing
          어떤 상황에 계신지 잘 파악이 안되네요. 좀 더 상세한 설명이 필요합니다.
          대화보기
          • 금산
            안녕하세요.
            좋은 강의 잘 듣고 있어 고맙게 생각합니다.
            그런데
            25.php 파일을 특정폴더 (localhost/IO_form/25.php)로 저장해야 실행이되나요...
            IO_form 폴더가 없어 내가 만든 폴더에 저장하여 실행하니 안되네요....
            도와주세요....
          버전 관리
          egoing
          현재 버전
          선택 버전
          graphittie 자세히 보기