PHP DELETE 링크 UI — GET 파라미터 · 쿼리 문자열 · href 액션 패턴 완전 정리
delete.html은 순수 HTML 파일이다. 테이블에 삭제 번호를 나열하고, 각 번호를 클릭하면 list.php?action=delete&id=N으로 이동하는 앵커 링크를 달아둔다. PHP 없이도 쿼리 문자열 파라미터를 링크로 전달하는 가장 단순한 방법이다.
URL에서 ?는 경로 끝과 파라미터 시작을 구분한다. 이후 key=value 형태로 데이터를 쓰고, 여러 개는 &로 연결한다. PHP에서는 이 파라미터들이 $_GET 배열에 자동으로 담긴다.
HTML 문법에서 &는 특수 문자 시작(엔티티)을 의미한다. href 속성 안에 &를 그대로 쓰면 W3C 유효성 검사에서 오류가 발생하고 일부 파서가 잘못 해석할 수 있다. 올바른 방법은 &로 이스케이프하는 것이다. 브라우저는 &를 &로 해석해 서버에 전달하므로 동작은 같다.
// W3C 유효성 오류
// 일부 파서에서 &id를 엔티티로 해석 시도
// 브라우저가 & → & 변환 후 전달
// W3C 표준 준수
delete.html은 [1]~[6]을 수동으로 HTML에 하드코딩했다. 데이터가 늘어나면 HTML을 직접 수정해야 한다. 실제 서비스에서는 PHP로 DB 목록을 조회해 while+fetch 루프로 동적으로 생성한다. 교육 단계에서는 GET 파라미터 개념 자체에 집중하기 위해 정적 HTML을 사용한 것이다.
<a href="list.php?action=delete&id=2">[2]</a>
<a href="list.php?action=delete&id=3">[3]</a>
// DB 변경 시 HTML 직접 수정 필요
$id = $row['id'];
echo "<a href='list.php?action=delete&id=$id'>[$id]</a>";
}
// DB 데이터에 따라 자동 생성
?action=delete&id=N 패턴은 삭제뿐만 아니라 다양한 액션에 응용된다. 게시판의 페이지 이동, 정렬 기준 변경, 필터 적용 등에서 자주 볼 수 있다. 핵심은 "어떤 파일로(경로)" + "무엇을 할지(action)" + "어떤 데이터를 대상으로(id)" 세 가지를 URL 하나에 담는 것이다.
| URL 패턴 예시 | 의미 | 서버 처리 |
|---|---|---|
list.php?action=delete&id=3 |
id=3 삭제 후 목록 | $_GET['action']=='delete' → DELETE 실행 |
list.php?page=2 |
목록 2페이지 | $_GET['page']==2 → LIMIT offset 계산 |
list.php?sort=age&order=desc |
나이 내림차순 정렬 | ORDER BY age DESC 쿼리 생성 |
search.php?keyword=홍 |
"홍" 검색 결과 | LIKE '%홍%' 쿼리 실행 |
delete.html의 링크 패턴은 교육용으로 이해하기 쉽지만, 실제 서비스에 그대로 적용하면 위험하다. URL이 외부에 노출되면 누구나 해당 URL로 접속해 데이터를 삭제할 수 있다. 이메일이나 SNS에 링크가 공유되거나, 검색 엔진이 크롤링하다가 삭제가 실행될 수 있다.
- POST 방식 사용: <form method="post"> + <button> — 링크로 접근 불가
- CSRF 토큰: 폼에 서버가 발급한 임의 토큰 포함 — 외부 요청 차단
- 인증 확인: 로그인 사용자만 삭제 가능하도록 권한 검사
- 확인 단계: JavaScript confirm() 또는 별도 확인 페이지
| 실수 | 증상 | 해결 |
|---|---|---|
| href에 &를 & 없이 사용 | W3C 유효성 오류 / 일부 파서 오작동 | href 속성 안에서는 &를 &로 이스케이프 |
| id 번호를 DB와 맞지 않게 하드코딩 | 존재하지 않는 id 삭제 요청 → rowCount()=0 (에러는 아님) | PHP 동적 생성으로 DB id를 그대로 반영 |
| GET으로 삭제 처리 — 인증 없음 | URL을 아는 누구나 삭제 가능 — 데이터 무결성 위협 | 로그인 세션 확인 + POST 방식 + CSRF 토큰 적용 |
| list.php에서 GET id를 바로 SQL에 삽입 | SQL Injection: ?id=1 OR 1=1로 전체 삭제 가능 | bindValue(':id', $_GET['id'], PARAM_INT) 반드시 사용 |
| action 파라미터를 서버에서 검증 안 함 | 알 수 없는 action 값에 대한 분기 없어 예외 처리 누락 | switch 또는 허용 action 목록으로 화이트리스트 검증 |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| PHP 통합 CRUD 허브 — list.php에서 INSERT·UPDATE·DELETE·검색·목록 완전 정리 (0) | 2026.07.09 |
|---|---|
| PHP MYDB.php 재사용 — CRUD 전체에 하나의 접속 함수 완전 정리 (0) | 2026.07.09 |
| PHP PDO DELETE + 전체 목록 — GET 파라미터 · isset · query() 완전 정리 (0) | 2026.07.08 |
| PHP PDO UPDATE + 세션 파기 — UPDATE SET · session_destroy · $_SESSION 초기화 완전 정리 (0) | 2026.07.08 |
| PHP 세션 ID 저장 + 기존값 폼 — session_start · $_SESSION · SELECT pre-fill 완전 정리 (0) | 2026.07.08 |
왕진 블로그

댓글