1. PHP에서는 POST 요청 이후 새로고침이 된다.
php에서 같은 파일에 post 요청을 처리하는 코드가 있을 때, 폼을 제출하면 페이지가 새로고침된다.
왜냐하면
- 사용자가 입력한 데이터를 폼을 통해 post로 보낸다.
- php가 post 요청을 받아서 처리한다.
- 브라우저는 응답을 받고 페이지를 다시 로드한다.
2. 문제점 : 새로고침하면 같은 post 요청이 다시 실행된다.
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 사용자가 입력한 데이터 받기
$data = $_POST["data"];
// 데이터베이스에 저장하는 코드 (예제)
echo "저장된 데이터: " . htmlspecialchars($data);
}
?>
<form method="post">
<input type="text" name="data">
<button type="submit">전송</button>
</form>
예를 들어 이런 코드가 있다고 해보자. 데이터베이스에 어떤 데이터를 저장하는 코드다.
이 코드는 잠재적인 문제가 있는데,
- 사용자가 폼을 입력하고 전송버튼을 누르면 post 요청이 서버로 간다.
- php가 데이터를 받아서 출력 ( 또는 저장 )
- 이 상태에서 새로고침하면 이전 post 요청이 다시 실행된다.
ㄴ 즉, 데이터가 중복으로 저장될 가능성이 있다.
3. 해결방법 : PRG 패턴 ( POST - Redirect - GET )
이 문제를 해결하려면 PRG 해턴을 사용해야 한다.
** PRG 패턴이란?
- 사용자가 폼을 입력하고 전송 버튼을 누르면 POST 요청이 발생한다.
- php가 데이터를 처리한 후, header("Location:...")을 사용해 다시 같은 페이지로 이동한다. ( 리다이렉트 )
- 이제 페이지가 새로 로드되지만 GET 요청이기 때문에 POST 데이터가 다시 전송되지 않는다.
이렇게 하면 새로고침해도 데이터가 중복 저장되지 않는다.
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 사용자가 입력한 데이터 받기
$data = $_POST["data"];
// 데이터베이스에 저장하는 코드 (예제)
echo "저장된 데이터: " . htmlspecialchars($data);
// POST → GET 으로 바꾸기 위해 리디렉트
header("Location: " . $_SERVER['PHP_SELF']);
exit(); // 이후 코드 실행 방지
}
?>
<form method="post">
<input type="text" name="data">
<button type="submit">전송</button>
</form>
1. 폼을 제출하면 POST 요청이 발생
• 사용자가 input에 입력한 값이 서버로 전송됨
2. PHP가 POST 데이터를 받아서 처리
• 여기선 그냥 출력하는 예제지만, 실제로는 데이터베이스에 저장할 수도 있음
3. header("Location: ...")로 현재 페이지를 다시 로드
• 이때 GET 요청으로 변경됨 → POST 요청이 다시 실행되지 않음!
4. exit();을 추가해 불필요한 코드 실행을 방지
• header() 이후에도 코드가 실행되면 안 되기 때문!
✔ 새로고침해도 같은 POST 요청이 다시 실행되지 않음 → 중복 저장 방지
✔ 사용자 경험이 더 좋아짐 → “다시 제출하시겠습니까?” 알림이 안 뜸
✔ 데이터 처리가 깔끔하게 정리됨
'Language > php' 카테고리의 다른 글
코딩 스타일 권장 가이드 (1) (0) | 2025.02.07 |
---|---|
디자인 패턴 (0) | 2025.02.04 |
FILTER ! : 외부에서 온 데이터는 검증해야 한다. (0) | 2025.01.31 |
SQL 인젝션 방지, htmlspecialchars(), isset() (0) | 2025.01.31 |
php 개발 시 참고사항 (3) - 연관배열 (0) | 2025.01.31 |