브라우저로부터 데이터 가져오기(4)

minah moon·2023년 8월 12일

PHP

목록 보기
24/58
post-thumbnail

폼 데이터가 서버로 전송되는 방법

폼은 방문자가 텍스트를 입력하고 옵션을 선택할 수 있게 한다. 각 폼 컨트롤에 대해 브라우저는 페이지 요청과 함께 이름과 값을 서버로 보낼 수 있다.

HTML <form> 태그는 두 가지 속성이 필요하다.

  • action 속성의 값은 폼 데이터를 전송해야 하는 PHP 파일이다.
  • method 속성의 값은 폼 데이터를 서버로 보내는 방법을 가리킨다.

method 속성은 다음의 두 값 중 하나를 가져야 한다.

  • GET은 URL 끝에 추가된 쿼리 문자열에서 HTTP GET을 사용하여 폼 데이터를 전송한다.
  • POST는 브라우저에서 서버로 전송한 HTTP 헤더에서 HTTP POST를 사용하여 데이터를 전송한다.
<form action="join.php" method="POST">
  <p>Email: <input type="email" name="email"></p>
  <p>Age: <input type="number" name="age"></p>
  <p><input type="checkbox" name="terms" value="true">
    I agree to the terms and conditions.</p>
  <input type="submit" value="Save">
</form>
  • 방문자가 폼을 제출하면 브라우저는 action 속성에 지정된 페이지를 요청한다.
  • action 속성의 값은 폼을 생성하는 페이지에서 그 폼을 처리하는 페이지까지의 상대 경로이거나 전체 URL일 수 있다.
  • 폼은 종종 폼을 표시하는 데 사용된 동일한 PHP 페이지로 제출되곤 한다.

위의 폼은 HTTP POST를 통해 전송되므로 브라우저는 폼 컨트롤의 이름과 값을 HTTP 헤더에 추가한다. 헤더는 join.php에 대한 요청과 함께 전송된다.

각 헤더에 대해

  • 이름은 해당 폼 컨트롤의 name 속성의 값이다.
  • 값은 사용자가 입력한 텍스트이거나 선택한 항목의 값이다.

다음의 HTML 폼 컨트롤은 두 가지 범주 중 하나로 분류된다. 방문자가 텍스트를 입력할 수 있게 하는 텍스트 입력과 방문자가 선택할 수 있게 하는 옵션이다.

텍스트 입력

  1. text : 한 줄의 텍스트 입력
<input type="text" name="username">
  1. number : 숫자 입력
<input type="number" name="age">
  1. email : 이메일 입력
<input type="email" name="email">
  1. password : 비밀번호 입력
<input type="password" name="password">
  1. textarea : 긴 텍스트 입력
<textarea name="bio"></textarea>

옵션

  1. radio : 여러 옵션 중 하나 선택
<input type="radio" name="rating" value="good">
<input type="radio" name="rating" value="bad">
  1. select : 여러 옵션 중 하나 선택
<select name="preferences">
  <option value="email">Email</option>
  <option value="phone">Phone</option>
</select>
  1. checkbox : 단일 옵션 선택
<input type="checkbox" name="terms" value="true">

폼 데이터 가져오기

PHP 인터프리터는 HTTP POST를 통해 전송된 데이터를 수신하면 슈퍼글로벌 배열인 $_POST에 추가된다.

방문자가 HTTP POST를 통해 폼을 제출하면 PHP 인터프리터는 페이지에 대한 요청을 받아서 폼 데이터를 슈퍼글로벌 배열인 $_POST에 추가한다.

  • 키는 폼 컨트롤의 이름이다.
  • 값은 사용자가 입력하거나 선택한 값이다.

HTTP GET을 통해 폼이 제출되면 PHP 인터프리터는 쿼리 문자열에서 폼 데이터를 가져와서 슈퍼글로벌 배열인 $_GET에 추가한다.

PHP 파일의 코드는 연관 배열의 값에 접근하는 것과 동일한 방식으로 슈퍼글로벌 배열인 $_POST의 값에 접근한다. 만약에 폼 컨트롤이 텍스트 입력이라면 그에 대한 값은 항상 존재할 것이다.

$email = $_POST['email'];

폼 컨트롤이 옵션이라면 방문자가 옵션을 선택했을 때 그 이름과 값은 HTTP 헤더에 추가된다. 따라서 널 병합 연산자는 슈퍼글로벌 배열인 $_POST에서 옵션을 수집하는 데 사용된다.

$age = $_POST['age'] ?? false;

예시

<?php include 'includes/header.php'; ?>
<form action="collecting-form-data.php" method="POST">
  <p>Name: <input type="text" name="name"></p>
  <p>Age: <input type="text" name="age"></p>
  <p>Email: <input type="text" name="email"></p>
  <p>Password: <input type="password" name="pwd"></p>
  <p>Bio: <textarea name="bio"></textarea></p>
  <p>Contact preference:
    <select name="preferences">
      <option value="email">Email</option>
      <option value="phone">Phone</option>
    </select>
  </p>
  <p>
    Rating:
    1 <input type="radio" name="rating" value="1">&nbsp;
    1 <input type="radio" name="rating" value="2">&nbsp;
    1 <input type="radio" name="rating" value="3">
  </p>
  <p>
    <input type="checkbox" name="terms" value="true">
    I agree to the terms and conditions.
  </p>
  <p>
    <input type="submit" value="Save">
  </p>
</form>
<pre><?php var_dump($_POST); ?></pre>
<?php include 'includes/footer.php'; ?>

결과


폼이 제출되었는지 확인하는 방법

데이터를 수집하고 처리하기 전에 폼이 제출되어야 한다. 폼이 HTTP POST 또는 HTTP GET을 통해 전송되었는지에 따라 폼이 제출되었는지를 확인하는 여러 기술이 있다.

HTTP POST

슈퍼글로벌 배열인 $_SERVER는 HTTP 메서드를 저장하는 REQUEST_METHOD라는 키를 가지고 있다. HTTP POST를 사용하여 폼이 제출되면 POST의 값을 갖는다.

폼이 HTTP POST를 사용하여 제출되었는지를 확인하려면 if 문의 조건으로 REQUEST_METHOD 키가 POST 값을 가졌는지를 확인한다.

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
	// 폼 데이터를 수집하고 처리하는 코드가 여기 온다.
}

HTTP GET

사용자가 링크를 클릭하거나 브라우저의 주소 표시줄에 URL을 입력하면, 요청은 항상 HTTP GET을 통해 전송된다. 따라서 폼이 HTTP GET을 통해 전송되었는지 확인하기 위해 $_SERVER 슈퍼글로벌을 사용할 수 없다.

대신에 다음 중 하나를 추가 할 수 있다.

  • 폼에 히든 입력hidden input을 추가하거나
  • 제출 버튼에 이름과 값을 추가

폼이 제출되면 히든 입력이나 제출 버튼의 이름과 값이 $_SERVER 슈퍼글로벌 배열에 추가된다.

그러면 if 문의 조건은 $_GET 슈퍼글로벌에 폼이 제출될 때 전송된 값이 있는지 확인할 수 있다. 만약에 있다면 데이터를 수집하고 처리하는 코드를 실행할 수 있다.

$submitted = $_GET['submitted'] ?? '';
if ($submitted === 'true') {
	// 폼 데이터를 수집하고 처리하는 코드가 여기 온다.
}





출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022

0개의 댓글