PHP 등록 폼 — POST + hidden action=insert · 통합 CRUD 허브 패턴 완전 정리
form.html은 단순한 등록 폼이다. 성·이름·나이를 입력받아 POST로 list.php에 전송한다. 이때 핵심은 <input type="hidden" name="action" value="insert"> — 눈에 보이지 않는 필드로 "insert 작업이다"라는 신호를 list.php에 함께 보낸다.
first_name = "길동"
age = "25"
action = "insert"
hidden 필드로 자동 포함됨
list.php는 INSERT·UPDATE·DELETE를 모두 처리한다. 어떤 작업을 해야 할지 알기 위해 "구분 신호"가 필요하다. 사용자가 매번 선택하게 하면 불편하고, URL에 드러내면 GET 방식이 된다. hidden input은 HTML 폼 안에 고정 값을 "숨겨서" 자동으로 전송하는 가장 단순한 해결책이다.
43-2 패턴에서 파일 역할 분업이 명확하다. form.html은 입력 UI만 제공하고, 실제 DB 처리는 list.php가 담당한다. form.html에는 PHP가 없다 — 순수 HTML이다. 이 분리가 UI와 로직을 분리하는 가장 기초적인 패턴이다.
| 파일 | 역할 | PHP 여부 | DB 접근 |
|---|---|---|---|
form.html |
등록 입력 UI | 없음 (순수 HTML) | 없음 |
updateform.php |
수정 입력 UI + 기존값 로드 | 있음 (PHP) | SELECT (읽기만) |
list.php |
INSERT/UPDATE/DELETE/검색+목록 처리 | 있음 (PHP) | 모든 조작 처리 |
MYDB.php |
DB 접속 함수 | 있음 (PHP) | 접속 제공만 |
form.html은 method="post"를 명시했다. INSERT 데이터는 URL에 보이면 안 되고, 이름이나 나이 같은 개인정보가 북마크·히스토리에 남으면 곤란하다. POST는 데이터를 HTTP 요청 본문에 담아 전송하므로 URL에 노출되지 않는다.
단점: 북마크에 저장됨, 히스토리에 남음, 링크 공유 시 데이터 유출
요청 본문에 데이터 포함 (사용자 눈에 안 보임)
장점: URL에 데이터 미노출, 새로고침 경고, 대용량 가능
hidden input은 화면에 보이지 않을 뿐, HTML 소스를 보거나 개발자 도구로 열면 value 값이 그대로 보인다. 사용자가 value를 "admin"이나 다른 값으로 조작해 보낼 수 있다. 서버에서 반드시 값 검증이 필요하다.
- 허용된 action만 처리: $allowed = ['insert', 'update', 'delete'];
- if (!in_array($_POST['action'], $allowed)) die('잘못된 요청');
- 숫자형 검증: $_POST['age']는 is_numeric()으로 확인
updateform.php도 똑같이 list.php로 POST 전송하되, hidden action 값이 "update"다. form.html과 updateform.php는 목적지(list.php)는 같고, action 값으로 처리 분기가 결정된다. 이것이 "통합 CRUD 허브" 패턴의 핵심이다.
input 태그의 name 속성값이 서버에서 $_POST 배열의 키가 된다. form.html의 name="last_name"은 list.php에서 $_POST['last_name']으로 읽힌다. 이름이 다르면 빈 문자열 또는 null이 되어 INSERT가 잘못된 데이터로 실행된다.
| form.html input name | list.php에서 읽는 방법 | bindValue 키 |
|---|---|---|
name="last_name" |
$_POST['last_name'] | ':last_name', PARAM_STR |
name="first_name" |
$_POST['first_name'] | ':first_name', PARAM_STR |
name="age" |
$_POST['age'] | ':age', PARAM_INT |
name="action" value="insert" |
$_POST['action'] == 'insert' | 분기 조건 (bindValue 아님) |
| 실수 | 증상 | 해결 |
|---|---|---|
| method="post" 누락 (기본값 GET) | $_POST['action']이 비어 INSERT 블록 미실행, URL에 데이터 노출 | method="post" 반드시 명시 |
| action="list.php" 오탈자 | 404 또는 다른 파일로 전송 | 파일명 정확히 확인 (대소문자·확장자 포함) |
| hidden name을 action 외 다른 이름 사용 | list.php에서 $_POST['action']으로 읽지 못해 insert 블록 미실행 | hidden name과 서버 측 $_POST 키 이름 반드시 일치 |
| hidden 필드에 동적 값 넣고 사용자 검증 생략 | 공격자가 value 조작 → 서버에서 의도치 않은 작업 실행 가능 | 서버 측 허용 action 목록 화이트리스트 검증 필수 |
| form.html을 .php 확장자로 변경 안 함 | PHP 코드 추가 필요 시 .html에서는 PHP 미실행 | PHP 로직 추가 시 form.php로 확장자 변경 |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| PHP MYDB 접속 함수 — DSN · setAttribute 2가지 설정 · return $pdo 완전 정리 (1) | 2026.07.09 |
|---|---|
| PHP 수정 폼 — GET id 검증 · $_SESSION 저장 · SELECT 기존값 폼 표시 완전 정리 (0) | 2026.07.09 |
| PHP 통합 CRUD 허브 — list.php에서 INSERT·UPDATE·DELETE·검색·목록 완전 정리 (0) | 2026.07.09 |
| PHP MYDB.php 재사용 — CRUD 전체에 하나의 접속 함수 완전 정리 (0) | 2026.07.09 |
| PHP DELETE 링크 UI — GET 파라미터 · 쿼리 문자열 · href 액션 패턴 완전 정리 (0) | 2026.07.08 |
왕진 블로그

댓글