본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP 등록 폼 — POST + hidden action=insert · 통합 CRUD 허브 패턴 완전 정리

by 왕진 2026. 7. 9.
반응형

 

 

Web Development · PHP HTML

PHP 등록 폼 — POST + hidden action=insert · 통합 CRUD 허브 패턴 완전 정리

form.html이 list.php로 POST 전송 시 hidden input으로 action=insert를 함께 보내는 방식 — 하나의 list.php가 INSERT·UPDATE·DELETE·검색을 모두 처리
시작 오늘 분석할 코드

form.html은 단순한 등록 폼이다. 성·이름·나이를 입력받아 POST로 list.php에 전송한다. 이때 핵심은 <input type="hidden" name="action" value="insert"> — 눈에 보이지 않는 필드로 "insert 작업이다"라는 신호를 list.php에 함께 보낸다.

<FORM name="form1" method="post" action="list.php"> 성:<BR> <INPUT type="text" name="last_name"><BR> 이름:<BR> <INPUT type="text" name="first_name"><BR> 연령:<BR> <INPUT type="text" name="age"><BR> <INPUT type="submit" value="송신"> <INPUT type="hidden" name="action" value="insert"> </FORM>
실제 출력 미리보기
form.html 화면
PHP 테스트

신규 등록화면

성:


이름:


연령:


← hidden: action=insert
송신 시 POST 데이터
last_name = "홍"
first_name = "길동"
age = "25"
action = "insert"
action은 사용자가 입력하지 않았지만
hidden 필드로 자동 포함됨
용어 핵심 용어 정리
hidden input화면에 보이지 않지만 폼 전송 시 함께 전달되는 필드 — 액션 신호·토큰 등 전달에 사용
action 파라미터insert/update/delete 중 무엇을 할지 서버에 알리는 신호 — 폼별로 다른 값 삽입
통합 CRUD 허브list.php 하나가 INSERT·UPDATE·DELETE·검색 모두 처리 — action 파라미터로 분기
POST 방식데이터가 URL이 아닌 요청 본문에 담겨 전달 — 민감 정보·대용량 데이터에 적합
method="post"FORM 태그의 전송 방식 지정 — 미지정 시 기본값 GET으로 URL에 데이터 노출
action="list.php"FORM 태그의 데이터 전송 목적지 — 어느 파일이 처리할지 지정
$_POST['action']서버 측에서 hidden action 필드 값 수신 — 'insert'/'update' 등 분기 조건으로 사용
순수 HTML 폼form.html은 PHP 없이 HTML만으로 구성 — 서버 처리는 list.php가 전담

1 hidden input이 필요한 이유 — 왜 action 값을 숨겨서 보내는가

list.php는 INSERT·UPDATE·DELETE를 모두 처리한다. 어떤 작업을 해야 할지 알기 위해 "구분 신호"가 필요하다. 사용자가 매번 선택하게 하면 불편하고, URL에 드러내면 GET 방식이 된다. hidden input은 HTML 폼 안에 고정 값을 "숨겨서" 자동으로 전송하는 가장 단순한 해결책이다.

// form.html → list.php POST 시 $_POST['last_name'] = "홍" // 사용자 입력값 $_POST['first_name'] = "길동" // 사용자 입력값 $_POST['age'] = "25" // 사용자 입력값 $_POST['action'] = "insert" // hidden — 사용자 개입 없이 고정값 // list.php에서 if(isset($_POST['action']) && $_POST['action'] == 'insert') { // INSERT 실행 }
※ action이라는 이름은 HTTP 관례 이름이 아니라 개발자가 정한 임의의 필드명이다. 같은 list.php로 가는 폼이라면 다른 이름(task, mode, cmd 등)을 써도 동작한다. 팀 내에서 일관된 이름을 정해두는 것이 중요하다.

2 form.html의 역할 — 통합 CRUD 허브와의 분업

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) 접속 제공만

3 POST vs GET — 폼 전송 방식 선택 기준

form.html은 method="post"를 명시했다. INSERT 데이터는 URL에 보이면 안 되고, 이름이나 나이 같은 개인정보가 북마크·히스토리에 남으면 곤란하다. POST는 데이터를 HTTP 요청 본문에 담아 전송하므로 URL에 노출되지 않는다.

GET 방식 (method="get" or 미지정)
URL에 노출: list.php?last_name=홍&first_name=길동&age=25

단점: 북마크에 저장됨, 히스토리에 남음, 링크 공유 시 데이터 유출
POST 방식 (method="post")
URL: list.php (데이터 없음)
요청 본문에 데이터 포함 (사용자 눈에 안 보임)

장점: URL에 데이터 미노출, 새로고침 경고, 대용량 가능

 

반응형

 

4 form.html → list.php 전체 흐름
1
사용자가 form.html에서 성·이름·나이 입력순수 HTML — PHP 없이 브라우저가 입력 필드 표시
2
"송신" 버튼 클릭3개 입력값 + hidden action=insert → POST로 list.php 전송
3
list.php가 $_POST['action'] 확인isset($_POST['action']) && $_POST['action'] == 'insert' → true
4
INSERT 블록 실행beginTransaction → prepare → 3개 bindValue → execute → commit
5
"데이터를 1건 입력하였습니다." 출력 후 전체 목록 표시INSERT 완료 후 같은 list.php가 SELECT 결과도 표시

5 hidden 필드의 보안적 한계

hidden input은 화면에 보이지 않을 뿐, HTML 소스를 보거나 개발자 도구로 열면 value 값이 그대로 보인다. 사용자가 value를 "admin"이나 다른 값으로 조작해 보낼 수 있다. 서버에서 반드시 값 검증이 필요하다.

⚠ hidden 필드는 "숨겨진" 것이 아니라 "화면에 렌더링되지 않는" 것이다. 브라우저 개발자 도구로 값을 바꾼 뒤 전송 가능. action 값이 'admin_delete_all' 같은 위험한 경우는 서버에서 허용된 값 목록으로 검증해야 한다.
서버 측 검증 예시 (list.php)
  • 허용된 action만 처리: $allowed = ['insert', 'update', 'delete'];
  • if (!in_array($_POST['action'], $allowed)) die('잘못된 요청');
  • 숫자형 검증: $_POST['age']는 is_numeric()으로 확인

6 updateform.php와의 비교 — action=update 패턴

updateform.php도 똑같이 list.php로 POST 전송하되, hidden action 값이 "update"다. form.html과 updateform.php는 목적지(list.php)는 같고, action 값으로 처리 분기가 결정된다. 이것이 "통합 CRUD 허브" 패턴의 핵심이다.

// form.html의 hidden <INPUT type="hidden" name="action" value="insert"> → $_POST['action'] = "insert" → list.php에서 INSERT 블록 실행 // updateform.php의 hidden <INPUT type="hidden" name="action" value="update"> → $_POST['action'] = "update" → list.php에서 UPDATE 블록 실행 // 삭제는 href 링크 (GET) list.php?action=delete&id=N → $_GET['action'] = "delete" → list.php에서 DELETE 블록 실행

7 name 속성 — input과 $_POST 키 이름 연결

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 아님)
⚠ type="text"인 age는 $_POST에서 문자열 "25"로 들어온다. bindValue에서 PARAM_INT를 지정하면 PHP/MySQL이 정수로 처리하지만, DB 컬럼 타입과 다를 경우 에러가 발생할 수 있으므로 PARAM_INT 지정은 컬럼 타입과 일치시킬 것.

8 자주 하는 실수
실수 증상 해결
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로 확장자 변경

핵심 한 줄 요약

hidden action=insert사용자 개입 없이 폼 전송 시 함께 전달 — list.php가 INSERT 블록 실행의 트리거
method="post"URL 노출 없이 데이터 전송 — INSERT 데이터는 URL에 남으면 안 됨
action="list.php"폼의 목적지 — form.html·updateform.php 모두 list.php로 보내 한 곳에서 처리
form.html의 역할UI만 제공 — PHP 없음, 처리 로직은 전부 list.php에서 담당
hidden 보안 한계HTML 소스로 값 확인·조작 가능 — 서버에서 허용된 action 값 화이트리스트 검증 필수

Tags

#PHP #HTML #POST폼 #히든필드 #action파라미터 #INSERT #통합CRUD #hidden #폼전송 #$_POST #method_post #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, HTML, POST폼, 히든필드, action파라미터, INSERT, 통합CRUD, hidden, 폼전송, $_POST
반응형

댓글