
폼은 방문자가 텍스트를 입력하고 옵션을 선택할 수 있게 한다. 각 폼 컨트롤에 대해 브라우저는 페이지 요청과 함께 이름과 값을 서버로 보낼 수 있다.
HTML <form> 태그는 두 가지 속성이 필요하다.
method 속성은 다음의 두 값 중 하나를 가져야 한다.
<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에 대한 요청과 함께 전송된다.
각 헤더에 대해
다음의 HTML 폼 컨트롤은 두 가지 범주 중 하나로 분류된다. 방문자가 텍스트를 입력할 수 있게 하는 텍스트 입력과 방문자가 선택할 수 있게 하는 옵션이다.
- text : 한 줄의 텍스트 입력
<input type="text" name="username">
- number : 숫자 입력
<input type="number" name="age">
- email : 이메일 입력
<input type="email" name="email">
- password : 비밀번호 입력
<input type="password" name="password">
- textarea : 긴 텍스트 입력
<textarea name="bio"></textarea>
- radio : 여러 옵션 중 하나 선택
<input type="radio" name="rating" value="good"> <input type="radio" name="rating" value="bad">
- select : 여러 옵션 중 하나 선택
<select name="preferences"> <option value="email">Email</option> <option value="phone">Phone</option> </select>
- 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"> 1 <input type="radio" name="rating" value="2"> 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을 통해 전송되었는지에 따라 폼이 제출되었는지를 확인하는 여러 기술이 있다.
슈퍼글로벌 배열인 $_SERVER는 HTTP 메서드를 저장하는 REQUEST_METHOD라는 키를 가지고 있다. HTTP POST를 사용하여 폼이 제출되면 POST의 값을 갖는다.
폼이 HTTP POST를 사용하여 제출되었는지를 확인하려면 if 문의 조건으로 REQUEST_METHOD 키가 POST 값을 가졌는지를 확인한다.
if ($_SERVER['REQUEST_METHOD'] == 'POST') { // 폼 데이터를 수집하고 처리하는 코드가 여기 온다. }
사용자가 링크를 클릭하거나 브라우저의 주소 표시줄에 URL을 입력하면, 요청은 항상 HTTP GET을 통해 전송된다. 따라서 폼이 HTTP GET을 통해 전송되었는지 확인하기 위해 $_SERVER 슈퍼글로벌을 사용할 수 없다.
대신에 다음 중 하나를 추가 할 수 있다.
폼이 제출되면 히든 입력이나 제출 버튼의 이름과 값이 $_SERVER 슈퍼글로벌 배열에 추가된다.
그러면 if 문의 조건은 $_GET 슈퍼글로벌에 폼이 제출될 때 전송된 값이 있는지 확인할 수 있다. 만약에 있다면 데이터를 수집하고 처리하는 코드를 실행할 수 있다.
$submitted = $_GET['submitted'] ?? ''; if ($submitted === 'true') { // 폼 데이터를 수집하고 처리하는 코드가 여기 온다. }
출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022