본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

PHP PDO UPDATE + 세션 파기 — UPDATE SET · session_destroy · $_SESSION 초기화 완전 정리

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

 

 

Web Development · PHP PDO

PHP PDO UPDATE + 세션 파기 — UPDATE SET · session_destroy · $_SESSION 초기화 완전 정리

세션에서 수정 대상 ID를 꺼내 UPDATE를 실행하고, 작업 완료 후 세션 변수를 초기화하고 세션을 파기하는 패턴
시작 오늘 분석할 코드

update.php는 updateform.php에서 넘어온 POST 데이터와 세션에 저장된 ID를 조합해 UPDATE 쿼리를 실행한다. 수정 완료 후에는 세션 변수를 전부 비우고($_SESSION = array()) 세션 자체를 파기(session_destroy())해 임시 데이터를 깔끔하게 정리한다.

<?php session_start(); ?> <HTML><BODY> <?php require_once("MYDB.php"); $pdo = db_connect(); $id = $_SESSION['id']; // updateform.php에서 저장한 수정 대상 ID 꺼냄 try { $pdo->beginTransaction(); $sql = "UPDATE member SET last_name = :last_name, first_name = :first_name, age = :age WHERE id = :id"; $stmh = $pdo->prepare($sql); $stmh->bindValue(':last_name', $_POST['last_name'], PDO::PARAM_STR); $stmh->bindValue(':first_name', $_POST['first_name'], PDO::PARAM_STR); $stmh->bindValue(':age', $_POST['age'], PDO::PARAM_INT); $stmh->bindValue(':id', $id, PDO::PARAM_INT); $stmh->execute(); $pdo->commit(); print "데이터를 " . $stmh->rowCount() . "건 수정하였습니다."; } catch (PDOException $e) { $pdo->rollBack(); print "오류: " . $e->getMessage(); } $_SESSION = array(); // 세션 변수 전부 삭제 session_destroy(); // 서버 세션 파일 삭제 ?>
전체 흐름 미리보기
updateform.php
$_SESSION['id']=1 저장
update.php
$_SESSION['id'] 꺼냄
UPDATE 실행
session_destroy()
데이터를 1건 수정하였습니다.
세션 파기 완료
용어 핵심 용어 정리
UPDATE SET기존 행의 특정 컬럼 값을 변경하는 SQL 문. WHERE 없으면 전체 행이 수정됨
$_SESSION['id']updateform.php에서 저장한 수정 대상 ID. 세션 복원 후 꺼내 WHERE :id에 바인딩
$_SESSION = array()세션 배열을 빈 배열로 초기화 — 현재 요청의 $_SESSION 변수에서 값을 전부 제거
session_destroy()서버에 저장된 세션 파일 삭제. $_SESSION 초기화와 함께 써야 완전 파기
UPDATE WHEREWHERE 절로 수정 대상 행을 지정. 생략하면 테이블 전체 행이 수정되는 치명적 실수
세션 파기 시점수정 작업이 완전히 끝난 후 파기 — 에러 시에도 세션은 살아있어야 retry 가능
rowCount()UPDATE 후 실제로 수정된 행 수. 0이면 WHERE 조건에 해당하는 행이 없었음
트랜잭션beginTransaction → execute → commit / rollBack — UPDATE도 INSERT처럼 트랜잭션으로 보호

1 UPDATE SET WHERE — 왜 WHERE가 필수인가

UPDATE 문에서 WHERE 절을 빠뜨리면 테이블의 모든 행이 수정된다. 회원 테이블에 1만 명이 있다면, WHERE 없는 UPDATE 한 번으로 전원의 이름이 같은 값으로 덮어쓰인다. 이 실수는 롤백하지 않는 한 복구가 불가능하다.

// WHERE 없는 UPDATE — 전체 행 수정 (절대 금지) "UPDATE member SET last_name = :last_name" // WHERE 있는 UPDATE — id 행만 수정 (올바른 방법) "UPDATE member SET last_name = :last_name WHERE id = :id"
⚠ WHERE에 넣는 id 값은 $_POST가 아닌 $_SESSION에서 가져온다. POST는 사용자가 개발자 도구로 조작할 수 있지만, 세션은 서버 측에서만 관리되기 때문이다.

2 UPDATE의 bindValue 4개 — id도 바인딩하는 이유

UPDATE에는 SET 컬럼 3개(last_name, first_name, age)와 WHERE 조건 1개(id), 총 4개의 자리표시자가 있다. id도 사용자 입력값이 아닌 정수이지만, 쿼리 구조에 변수를 직접 이어붙이지 않는다는 원칙을 일관되게 지키기 위해 bindValue를 사용한다.

$stmh->bindValue(':last_name', $_POST['last_name'], PDO::PARAM_STR); $stmh->bindValue(':first_name', $_POST['first_name'], PDO::PARAM_STR); $stmh->bindValue(':age', $_POST['age'], PDO::PARAM_INT); $stmh->bindValue(':id', $id, PDO::PARAM_INT); // $id는 $_SESSION에서 꺼낸 값이지만 동일하게 bindValue 처리

3 $_SESSION = array() — 왜 session_destroy()만으로는 부족한가

PHP의 세션 파기는 2단계다. session_destroy()는 서버의 세션 파일을 삭제하지만, 현재 요청에서 PHP 메모리에 이미 올라온 $_SESSION 배열은 그대로 남아 있다. 세션 파기 후 같은 요청 내에서 $_SESSION['id']를 읽으면 여전히 값이 있다. $_SESSION = array()로 먼저 비워야 완전하다.

session_destroy()만 호출
session_destroy();

// 서버 파일은 지워졌지만
echo $_SESSION['id']; // → 여전히 "1" 출력됨!
// 현재 요청의 메모리에 남아있음
2단계 완전 파기
$_SESSION = array(); // 메모리 초기화
session_destroy(); // 파일 삭제

echo $_SESSION['id']; // → 값 없음
// 완전히 파기됨
※ 쿠키에 저장된 세션 ID까지 완전히 제거하려면 setcookie(session_name(), '', time()-42000, '/') 도 호출해야 한다. 로그아웃 처리에서 중요한 패턴이다.

 

반응형

 

4 세션 파기 타이밍 — 왜 commit() 이후에 파기하는가

세션 파기를 try 블록 안에 두면 에러가 났을 때 catch로 이동하면서 세션도 사라진다. 다시 시도하려면 세션이 필요한데 이미 파기된 상태다. 세션 파기는 UPDATE 성공 여부와 무관하게, try-catch 블록이 완전히 끝난 후 실행해야 안전하다.

1
session_start() — 세션 복원$_SESSION['id'] = 1 접근 가능
2
$id = $_SESSION['id'] — 값 꺼냄지역 변수 $id에 저장해두면 세션 파기 후에도 사용 가능
3
beginTransaction → execute → commitUPDATE 실행 + 트랜잭션 확정
4
try-catch 종료 후 — $_SESSION = array(); session_destroy()성공·실패 모두 try-catch가 끝난 후에 파기 → 재시도 가능성 유지

5 UPDATE vs INSERT — SQL 문법 비교
구분 INSERT UPDATE
용도 새 행 추가 기존 행 수정
기본 구조 INSERT INTO 테이블 (컬럼) VALUES (:값) UPDATE 테이블 SET 컬럼=:값 WHERE 조건
WHERE 불필요 (없어도 됨) 필수 — 없으면 전체 수정
rowCount() 추가된 행 수 (보통 1) 수정된 행 수 (0이면 조건 불일치)
트랜잭션 beginTransaction/commit 사용 동일하게 beginTransaction/commit 사용

6 rowCount()가 0일 때 — 왜 에러가 아닌가

UPDATE 후 rowCount()가 0이면 WHERE 조건에 맞는 행이 없었다는 뜻이다. 이것은 SQL 에러가 아니라 정상 처리다. PDOException이 발생하지 않으므로 catch 블록으로 가지 않는다. "0건 수정"이라는 결과를 사용자에게 보여주는 것이 적절하다.

// rowCount() 결과 해석 1건 → 정상 수정 완료 0건 → WHERE 조건에 맞는 행 없음 (에러는 아님) // rowCount() = 0 + 에러 없음 = 정상 처리지만 해당 행 없음
⚠ UPDATE에서 값이 기존 값과 동일하면 MySQL은 실제 수정을 하지 않고 rowCount()를 0으로 반환할 수 있다. 이것은 버그가 아니라 MySQL의 최적화 동작이다.

7 3파일 전체 흐름 — MYDB · updateform · update의 역할 분리

이 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 쿼리가 완성됨

8 자주 하는 실수
실수 증상 해결
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는 무시

핵심 한 줄 요약

UPDATE SET WHEREWHERE 없으면 전체 행 수정 — 반드시 WHERE id = :id 포함
$_SESSION['id']수정 대상 ID는 POST가 아닌 세션에서 꺼냄 — 클라이언트 조작 불가
$_SESSION = array()세션 파기 1단계: 메모리의 값 초기화 — destroy()만으로는 부족
session_destroy()세션 파기 2단계: 서버 파일 삭제 — 두 단계를 같이 써야 완전 파기
세션 파기 타이밍try-catch 완전히 끝난 후 — 에러 시 재시도 가능성 유지
rowCount() = 0에러가 아님 — WHERE 조건 해당 행 없음 또는 값 동일 시 MySQL 최적화

Tags

#PHP #MySQL #UPDATE #세션파기 #session_destroy #$_SESSION #PDO #beginTransaction #commit #rollBack #WHERE조건 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, MySQL, UPDATE, 세션파기, session_destroy, $_SESSION, PDO, beginTransaction, commit, WHERE조건
반응형

댓글