본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

PHP 되돌아가기 버튼 + isset() — 다중 Submit 분기 완전 정리

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

 

 

Web Development · PHP

PHP 되돌아가기 버튼 + isset() —
다중 Submit 분기 완전 정리

같은 FORM에 "확인"과 "되돌아가기" 두 버튼을 두고, PHP에서 어느 버튼을 눌렀는지 분기 처리
시작 오늘 분석할 코드

확인 페이지에 두 개의 submit 버튼을 둔다. "확인" 버튼은 최종 처리 페이지로, "되돌아가기" 버튼은 입력 페이지로 돌아가게 만드는 패턴이다. PHP는 어느 버튼이 눌렸는지를 isset()으로 판별해 분기한다.

form.html
입력
confirm.php
확인/되돌아가기
→ 확인
view.php
완료

※ 되돌아가기 클릭 시: view.php → isset(back) 분기 → form.html 재출력

confirm.php — 두 개의 submit 버튼
<FORM name="form1" method="post" action="view.php"> <?php print "이름:".$_POST["onamae"]; print "<BR>본문 :<BR>".nl2br($_POST["honbun"]); ?> <INPUT type="submit" name="kakunin" value="확인"> <INPUT type="submit" name="modoru" value="되돌아가기"> <INPUT type="hidden" name="onamae" value="<?=$_POST["onamae"]?>"> <INPUT type="hidden" name="honbun" value="<?=$_POST["honbun"]?>"> </FORM>
view.php — isset()으로 버튼 분기
<?php if (isset($_POST["kakunin"])) { // "확인" 버튼이 눌렸을 때 print $_POST["onamae"]." 님으로부터의 메시지"; print "<BR>본문 :<BR>".nl2br($_POST["honbun"]); } elseif (isset($_POST["modoru"])) { // "되돌아가기" 버튼이 눌렸을 때 — 입력값 채워서 form 재출력 ?> <FORM method="post" action="confirm.php"> 이름: <INPUT type="text" name="onamae" value="<?=$_POST["onamae"]?>"><BR> 본문: <TEXTAREA name="honbun" cols="30" rows="5"><?=$_POST["honbun"]?></TEXTAREA><BR> <INPUT type="hidden" name="user_id" value="<?=$_POST["user_id"]?>"> <INPUT type="submit" value="발송"> </FORM> <?php } else { // 직접 URL 접근 등 비정상 경로 print "잘못된 접근입니다."; } ?>
용어 용어 정리
isset()PHP 함수 — 변수가 존재하고 null이 아니면 true 반환
submit namesubmit 버튼에 name을 주면 그 버튼이 눌렸을 때만 $_POST에 포함
kakunin일본어 "확인" — 이 submit이 눌리면 $_POST["kakunin"] 존재
modoru일본어 "되돌아가다" — 눌리면 $_POST["modoru"] 존재
if / elseif / elsePHP 조건문 — 위에서부터 순서대로, 처음 true인 블록만 실행
폼 재출력되돌아가기 시 PHP가 직접 form HTML을 생성, 이전 입력값 복원
ob_start()출력 버퍼링 시작 — header() 호출 전 출력이 있어도 동작하게 함
exitPHP 실행 즉시 종료 — header() 이후 반드시 호출

1 submit 버튼에 name을 주는 이유
왜 버튼마다 다른 name이 필요한가?

FORM 안에 submit 버튼이 여러 개일 때, 클릭된 버튼만 $_POST에 포함된다. name이 없는 버튼은 $_POST에 아무 흔적도 남기지 않는다. 따라서 버튼마다 고유한 name을 주어야 PHP에서 "어느 버튼이 눌렸는지"를 구분할 수 있다.

"확인" 버튼 클릭 시 $_POST: $_POST["kakunin"] = "확인" ← 존재 (isset = true) $_POST["modoru"] ← 없음 (isset = false) "되돌아가기" 버튼 클릭 시 $_POST: $_POST["kakunin"] ← 없음 (isset = false) $_POST["modoru"] = "되돌아가기" ← 존재 (isset = true)
※ 눌린 버튼의 value가 $_POST에 담기는 것이다. value를 비워두면 빈 문자열이 들어오므로, 보통 isset()으로 key 존재 여부만 확인하면 충분하다.

2 isset() — 배열 key 존재 여부 확인
왜 isset()을 쓰는가?

isset()은 "이 변수가 세팅(set)되어 있는가?"를 확인한다. 없는 배열 key에 바로 접근하면 "Undefined index" 경고가 나는데, isset()으로 먼저 체크하면 오류 없이 안전하게 분기할 수 있다.

isset($_POST["kakunin"]) → key 존재하고 null이 아니면 true → 없으면 false (오류 없음, Warning 없음) // isset 없이 직접 접근: if ($_POST["kakunin"]) { ... } → key가 없으면 PHP Warning 발생
isset()의 다양한 활용
표현 의미 결과
isset($var) 변수가 존재하고 null이 아닌가 true / false
isset($_POST["key"]) POST에 key가 있는가 true / false
isset($arr["key"]) 배열에 key가 있는가 true / false
!isset($var) 변수가 없거나 null인가 true / false (반전)
※ PHP에서 배열 key 접근 전 isset() 체크는 표준 패턴이다. 항상 습관화하면 "Undefined index" 경고를 원천 차단한다.

3 if / elseif / else — 조건 체인
실행 순서는 어떻게 되는가?

조건이 두 개 이상일 때 if → elseif → else를 체인으로 연결한다. 위에서부터 순서대로 검사하고, 처음 true인 블록 하나만 실행한다. 나머지 블록은 건너뛴다.

if (kakunin이 눌렸다) { 확인 처리 → 메시지 출력 } elseif (modoru가 눌렸다) { 되돌아가기 처리 → form 재출력 ← if가 false여야 여기 진입 } else { 둘 다 아님 → 오류 메시지 ← 위 둘 모두 false일 때 }
※ else 블록은 직접 URL 접근, 세션 만료, CSRF 등 예상치 못한 접근을 처리하는 안전망이다. 빠뜨리지 말 것.

 

반응형

 

4 되돌아가기 — form 재출력 패턴
왜 header() 대신 form을 직접 출력하는가?

이 코드에서 "되돌아가기"는 header("Location: form.html")으로 리디렉션하는 대신 PHP가 직접 form HTML을 생성해 이전 입력값을 복원한다. 이 방식의 장점은 이전에 입력한 onamae, honbun 값이 INPUT에 미리 채워진다는 것이다.

header() 리디렉션
브라우저를 form.html로 이동
입력값 모두 사라짐
코드가 간결함
출력 전에 호출해야 함
form 재출력 (이 코드)
PHP가 form HTML을 동적으로 생성
이전 입력값이 복원됨
코드가 길어짐
출력 순서 제약 없음
※ UX 관점에서는 form 재출력이 훨씬 낫다. "되돌아가기"를 눌렀는데 입력값이 전부 날아가면 사용자 경험이 나쁘다. 긴 폼일수록 이 패턴이 중요하다.

5 ob_start() — header() 안전 호출 패턴
header() 호출 전에 출력이 있으면?

header()는 HTML이 한 글자도 출력되지 않은 상태에서 호출해야 한다. 이미 출력이 있으면 "Cannot modify header information — headers already sent" 오류가 발생한다. ob_start()는 이 문제를 우회한다.

// 문제 상황 — header() 전에 이미 HTML 출력 echo "확인화면"; ← 이미 출력 header("Location: form.html"); ← 오류! // ob_start()로 해결 — 출력을 버퍼에 저장 ob_start(); ← PHP 파일 최상단에서 호출 echo "확인화면"; ← 버퍼에 저장 (실제 출력 안 됨) header("Location: form.html"); ← 정상 동작!
ob_start()를 쓰면 echo나 print로 출력한 내용이 실제 브라우저로 가지 않고 서버 내부 버퍼에 쌓인다. header() 호출 후 ob_end_clean()으로 버퍼를 비우거나 ob_end_flush()로 내보낼 수 있다.

6 데이터 흐름 전체 순서
1
form.html: 입력 후 "송신"onamae, honbun → POST → confirm.php
2
confirm.php: 두 버튼 표시 + hidden 준비내용 출력, kakunin/modoru submit + hidden에 데이터 재삽입
3a
"확인" 클릭 → view.php: isset(kakunin) = true메시지 출력 — 최종 완료 처리
3b
"되돌아가기" 클릭 → view.php: isset(modoru) = true이전 입력값 채워서 form HTML 재출력 — 사용자가 수정 후 재전송 가능
4
else 분기: 직접 URL 접근"잘못된 접근입니다." 출력 — 비정상 경로 처리

7 자주 하는 실수
실수 증상 해결
submit 버튼에 name 없음 $_POST에 버튼 정보 없어 분기 불가 모든 submit 버튼에 고유 name 부여
isset() 없이 배열 직접 접근 Undefined index PHP Warning 배열 접근 전 항상 isset()으로 존재 확인
confirm.php의 hidden 누락 view.php에서 onamae/honbun 빈 값 confirm.php의 FORM에 모든 데이터 hidden으로 재삽입
되돌아가기 후 입력값 사라짐 form.html로 리디렉션 시 입력 초기화 form 재출력 패턴으로 입력값 value에 복원
else 분기 누락 직접 URL 접근 시 빈 화면 또는 오류 else로 오류 메시지 표시
TEXTAREA 되돌아가기 시 value 속성 사용 기본값이 표시 안 됨 TEXTAREA는 태그 사이에 텍스트로 복원: <?=$_POST["honbun"]?>

다중 submit 분기 패턴 설계 포인트
  • 버튼마다 고유한 name 지정 — 눌린 버튼만 $_POST에 포함됨
  • isset()으로 key 존재 확인 후 접근 — Undefined index 방지
  • else 분기 필수 — 비정상 접근(직접 URL, CSRF) 처리
  • 되돌아가기는 form 재출력으로 이전 입력값 복원 — UX 향상
  • hidden value에 htmlspecialchars(ENT_QUOTES) 적용 — XSS 차단

핵심 한 줄 요약

submit에 name 부여눌린 버튼만 $_POST에 포함 — 미부여 시 구분 불가
isset($_POST["kakunin"])해당 버튼이 눌렸는지 안전하게 확인
if / elseif / else위에서부터 검사, 처음 true인 블록만 실행
form 재출력 패턴PHP로 form HTML 동적 생성 → 이전 입력값 value 복원
ob_start()출력 버퍼링 → header() 앞에 echo가 있어도 오류 없이 동작

Tags

#PHP #되돌아가기 #isset #if-elseif-else #다중submit #name속성버튼 #버튼분기 #ob_start #Location리디렉션 #폼재출력 #폼라우팅 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, 되돌아가기, isset, if-elseif-else, 다중submit, name속성버튼, 버튼분기, ob_start, Location리디렉션, 폼재출력, 폼라우팅, 웹개발, 티스토리
반응형

댓글