PHP PDO UPDATE + 세션 파기 — UPDATE SET · session_destroy · $_SESSION 초기화 완전 정리
update.php는 updateform.php에서 넘어온 POST 데이터와 세션에 저장된 ID를 조합해 UPDATE 쿼리를 실행한다. 수정 완료 후에는 세션 변수를 전부 비우고($_SESSION = array()) 세션 자체를 파기(session_destroy())해 임시 데이터를 깔끔하게 정리한다.
$_SESSION['id']=1 저장
$_SESSION['id'] 꺼냄
UPDATE 실행
session_destroy()
UPDATE 문에서 WHERE 절을 빠뜨리면 테이블의 모든 행이 수정된다. 회원 테이블에 1만 명이 있다면, WHERE 없는 UPDATE 한 번으로 전원의 이름이 같은 값으로 덮어쓰인다. 이 실수는 롤백하지 않는 한 복구가 불가능하다.
UPDATE에는 SET 컬럼 3개(last_name, first_name, age)와 WHERE 조건 1개(id), 총 4개의 자리표시자가 있다. id도 사용자 입력값이 아닌 정수이지만, 쿼리 구조에 변수를 직접 이어붙이지 않는다는 원칙을 일관되게 지키기 위해 bindValue를 사용한다.
PHP의 세션 파기는 2단계다. session_destroy()는 서버의 세션 파일을 삭제하지만, 현재 요청에서 PHP 메모리에 이미 올라온 $_SESSION 배열은 그대로 남아 있다. 세션 파기 후 같은 요청 내에서 $_SESSION['id']를 읽으면 여전히 값이 있다. $_SESSION = array()로 먼저 비워야 완전하다.
// 서버 파일은 지워졌지만
echo $_SESSION['id']; // → 여전히 "1" 출력됨!
// 현재 요청의 메모리에 남아있음
session_destroy(); // 파일 삭제
echo $_SESSION['id']; // → 값 없음
// 완전히 파기됨
세션 파기를 try 블록 안에 두면 에러가 났을 때 catch로 이동하면서 세션도 사라진다. 다시 시도하려면 세션이 필요한데 이미 파기된 상태다. 세션 파기는 UPDATE 성공 여부와 무관하게, try-catch 블록이 완전히 끝난 후 실행해야 안전하다.
| 구분 | INSERT | UPDATE |
|---|---|---|
| 용도 | 새 행 추가 | 기존 행 수정 |
| 기본 구조 | INSERT INTO 테이블 (컬럼) VALUES (:값) | UPDATE 테이블 SET 컬럼=:값 WHERE 조건 |
| WHERE | 불필요 (없어도 됨) | 필수 — 없으면 전체 수정 |
| rowCount() | 추가된 행 수 (보통 1) | 수정된 행 수 (0이면 조건 불일치) |
| 트랜잭션 | beginTransaction/commit 사용 | 동일하게 beginTransaction/commit 사용 |
UPDATE 후 rowCount()가 0이면 WHERE 조건에 맞는 행이 없었다는 뜻이다. 이것은 SQL 에러가 아니라 정상 처리다. PDOException이 발생하지 않으므로 catch 블록으로 가지 않는다. "0건 수정"이라는 결과를 사용자에게 보여주는 것이 적절하다.
이 3개 파일은 "수정" 기능을 역할별로 분리한 구조다. MYDB.php는 접속만, updateform.php는 조회+폼 표시만, update.php는 수정 처리만 담당한다. 각 파일이 한 가지 역할에만 집중하기 때문에 코드를 읽기 쉽고, 부분 교체도 쉽다.
| 파일 | 역할 | 세션 관계 |
|---|---|---|
MYDB.php |
DB 접속 함수 db_connect() 제공 | 세션과 무관 — 어느 파일에서나 require_once로 사용 |
updateform.php |
ID로 기존 값 조회 + 폼 표시 | session_start() + $_SESSION['id'] = $id 저장 |
update.php |
폼 POST + 세션 ID로 UPDATE 실행 | session_start() + $_SESSION['id'] 읽기 + 파기 |
- updateform.php → update.php (POST): last_name, first_name, age (사용자가 폼에 입력한 수정 값)
- updateform.php → update.php (세션): id (수정 대상 식별자 — 서버 측으로만 이동)
- 두 경로가 update.php에서 합쳐져 UPDATE SET ... WHERE id = :id 쿼리가 완성됨
| 실수 | 증상 | 해결 |
|---|---|---|
| UPDATE WHERE 누락 | 테이블 전체 행이 동일한 값으로 수정 — 복구 불가 | WHERE id = :id 반드시 포함, 실행 전 SQL 문자열 재확인 |
| $_SESSION = array() 없이 session_destroy() | 파일은 삭제됐지만 현재 요청에서 $_SESSION 값이 남아있음 | 항상 $_SESSION = array() 먼저, 그 다음 session_destroy() 순서로 |
| session_start() 누락 | $_SESSION['id'] 접근 시 undefined — id 없이 UPDATE 실행되거나 에러 | update.php 첫 줄에 session_start() 반드시 추가 |
| try 블록 안에서 세션 파기 | 에러 발생 시 catch로 이동 + 세션 파기됨 — 재시도 불가 | 세션 파기는 try-catch 밖, 코드 마지막에 위치 |
| id를 $_POST에서 받음 | 사용자가 id 조작 → 다른 사람 정보 수정 가능 (Broken Access Control) | id는 반드시 $_SESSION에서만 가져옴 — POST id는 무시 |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| PHP DELETE 링크 UI — GET 파라미터 · 쿼리 문자열 · href 액션 패턴 완전 정리 (0) | 2026.07.08 |
|---|---|
| PHP PDO DELETE + 전체 목록 — GET 파라미터 · isset · query() 완전 정리 (0) | 2026.07.08 |
| PHP 세션 ID 저장 + 기존값 폼 — session_start · $_SESSION · SELECT pre-fill 완전 정리 (0) | 2026.07.08 |
| PHP PDO 접속 함수 분리 — MYDB.php · require_once · db_connect 완전 정리 (0) | 2026.07.08 |
| PHP PDO LIKE 검색 — fetch(FETCH_ASSOC) + htmlspecialchars 완전 정리 (0) | 2026.07.08 |
왕진 블로그

댓글