반응형
Web Development · PHP PDO 세션
PHP 수정 폼 — GET id 검증 · $_SESSION 저장 · SELECT 기존값 폼 표시 완전 정리
수정 링크에서 GET으로 id를 받아 검증하고, 세션에 저장 후 DB에서 기존 데이터를 불러와 input value에 미리 채워주는 패턴
시작 오늘 분석할 코드
updateform.php는 수정 전 현재 데이터를 보여주는 폼이다. list.php의 "수정" 링크(updateform.php?id=N)를 클릭하면 GET으로 id를 받고, 세션에 저장 후 DB에서 해당 데이터를 SELECT해 input의 value에 미리 채운다.
<?php session_start(); ?> <!-- HTML 영역 ... --> <?php require_once("MYDB.php"); $pdo = db_connect(); // GET id 검증 if(isset($_GET['id']) && $_GET['id'] > 0){ $id = $_GET['id']; $_SESSION['id'] = $id; // 세션에 저장 }else{ exit('잘못된 파라미터입니다.'); } // 현재 데이터 조회 try{ $sql = "SELECT * FROM member WHERE id = :id "; $stmh = $pdo->prepare($sql); $stmh->bindValue(':id', $id, PDO::PARAM_INT); $stmh->execute(); $count = $stmh->rowCount(); }catch(PDOException $Exception){ print "오류:".$Exception->getMessage(); } // 기존값 폼 표시 if($count < 1){ print "수정 데이터가 없습니다."; }else{ $row = $stmh->fetch(PDO::FETCH_ASSOC); // $row['last_name'], $row['first_name'], $row['age']를 value=에 삽입 } ?>
실제 출력 미리보기
updateform.php?id=3 접속 시
데이터 흐름
GET ?id=3
→ $_SESSION['id'] = 3
→ SELECT WHERE id=3
→ $row = ['id'=>3,'last_name'=>'김',...]
→ value=""> // 만약 $row['last_name'] = 'Kim " onmouseover="alert(1)' // → <INPUT value="Kim " onmouseover="alert(1)"> ← XSS! // 안전: htmlspecialchars()로 이스케이프 <INPUT value=""> // → <INPUT value="Kim " onmouseover="alert(1)""> ← 안전
→ $_SESSION['id'] = 3
→ SELECT WHERE id=3
→ $row = ['id'=>3,'last_name'=>'김',...]
→ value=""> // 만약 $row['last_name'] = 'Kim " onmouseover="alert(1)' // → <INPUT value="Kim " onmouseover="alert(1)"> ← XSS! // 안전: htmlspecialchars()로 이스케이프 <INPUT value=""> // → <INPUT value="Kim " onmouseover="alert(1)""> ← 안전
5 updateform.php → list.php 전체 흐름
1
list.php 목록에서 [수정] 클릭href="updateform.php?id=3" → GET으로 id=3 전달
2
session_start() — 파일 최상단세션 기능 활성화 (반드시 HTML 출력 전, 첫 줄에 위치)
3
GET id 검증isset($_GET['id']) && > 0 → 통과 / 실패 시 exit()
4
$_SESSION['id'] = $id 저장서버 세션에 id 보관 — list.php 전환 후에도 유지
5
SELECT WHERE id = :id 실행 → fetch()기존 데이터 1건 조회 → $row 배열에 저장
6
input value에 htmlspecialchars($row[...]) 출력사용자가 기존 데이터를 확인하면서 수정 가능
7
"수정" 클릭 → list.php POSThidden action=update + 변경값 → list.php가 UPDATE 실행
6 exit() vs die() — 즉시 종료의 두 가지 방법
updateform.php에서 잘못된 id 파라미터를 받으면 exit('잘못된 파라미터입니다.')로 즉시 종료한다. PHP에서 exit()과 die()는 동일한 기능이다. die()는 exit()의 별칭(alias)으로, 어느 것을 쓰든 결과가 같다.
| 함수 | 동작 | 인수 | 관계 |
|---|---|---|---|
exit() |
즉시 스크립트 종료 | 문자열: 종료 전 출력 / 정수: 종료 코드 | PHP 언어 구조 |
die() |
즉시 스크립트 종료 | 동일 | exit()의 별칭 (완전히 동일) |
// 두 코드는 완전히 동일 exit('잘못된 파라미터입니다.'); die('잘못된 파라미터입니다.'); // 관례: die()는 오류 상황, exit()은 정상 종료에 쓰는 경향이 있으나 // PHP 언어 레벨에서는 차이 없음
updateform.php에서 exit()이 중요한 이유
- 잘못된 id로 진입 시 이후 SELECT, fetch, 폼 출력 코드가 실행되면 안 됨
- return으로 함수를 끝내는 것과 달리 exit()은 파일 전체를 즉시 종료
- 잘못된 요청에 대한 명확한 차단 — 연쇄 에러 없이 깔끔하게 종료
7 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| session_start()을 HTML 출력 후에 작성 | "headers already sent" Warning, 세션 미작동 | 파일 첫 번째 줄(DOCTYPE보다 먼저)에 세션 시작 |
| exit() 없이 else에 메시지만 | 잘못된 id로도 이후 DB 코드 실행 — 오류 연쇄 | 잘못된 진입 즉시 exit()으로 종료 |
| fetch() 전 rowCount() 미확인 | 결과 없는데 $row 사용 → false 반환 → 배열 접근 오류 | rowCount() < 1 이면 fetch() 호출 안 함 |
| value에 htmlspecialchars() 누락 | 이름에 특수문자 시 폼 깨짐 또는 XSS 취약점 | value="" 반드시 적용 |
| $_SESSION['id'] 저장 후 세션 파기 안 함 | UPDATE 완료 후에도 $_SESSION['id'] 잔류 → 다음 요청에서 잘못된 UPDATE 가능 | list.php에서 UPDATE 완료 후 unset($_SESSION['id']) |
핵심 한 줄 요약
isset() + > 0GET id 이중 검증 — 파라미터 존재 + 양수 모두 충족해야 진행
exit('메시지')잘못된 접근 즉시 차단 — 이후 DB 코드 실행 방지
$_SESSION['id']id를 서버 세션에 보관 — hidden 필드보다 조작 불가능한 안전한 id 전달
fetch() 1회PRIMARY KEY WHERE 조건 = 단건 결과 — while 불필요, fetch 한 번으로 $row 획득
value="htmlspecialchars()"DB 값을 폼에 출력 시 XSS 방어 — 특수문자 포함 데이터도 안전하게 렌더링
Tags
#PHP #PDO #세션 #session_start #$_SESSION #$_GET #exit #SELECT #fetch #기존값폼 #수정폼 #htmlspecialchars #PHP학습 #웹개발
▼ 티스토리 태그 입력란 복사용
PHP, PDO, 세션, session_start, $_SESSION, $_GET, exit, SELECT, fetch, 기존값폼, 수정폼, htmlspecialchars, PHP학습, 웹개발
반응형
'php' 카테고리의 다른 글
| PHP sort() — 오름차순 배열 정렬 · 인덱스 재배치 · print_r 완전 정리 (0) | 2026.07.09 |
|---|---|
| PHP MYDB 접속 함수 — DSN · setAttribute 2가지 설정 · return $pdo 완전 정리 (1) | 2026.07.09 |
| PHP 등록 폼 — POST + hidden action=insert · 통합 CRUD 허브 패턴 완전 정리 (0) | 2026.07.09 |
| PHP 통합 CRUD 허브 — list.php에서 INSERT·UPDATE·DELETE·검색·목록 완전 정리 (0) | 2026.07.09 |
| PHP MYDB.php 재사용 — CRUD 전체에 하나의 접속 함수 완전 정리 (0) | 2026.07.09 |
왕진 블로그

댓글