본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

PHP DELETE 링크 UI — GET 파라미터 · 쿼리 문자열 · href 액션 패턴 완전 정리

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

 

 

Web Development · PHP HTML

PHP DELETE 링크 UI — GET 파라미터 · 쿼리 문자열 · href 액션 패턴 완전 정리

앵커 링크의 href에 ?action=delete&id=N 형태의 쿼리 문자열을 담아 서버에 삭제 요청을 전달하는 패턴
시작 오늘 분석할 코드

delete.html은 순수 HTML 파일이다. 테이블에 삭제 번호를 나열하고, 각 번호를 클릭하면 list.php?action=delete&id=N으로 이동하는 앵커 링크를 달아둔다. PHP 없이도 쿼리 문자열 파라미터를 링크로 전달하는 가장 단순한 방법이다.

<BODY> 삭제 번호를 클릭하세요. <TABLE> <TR><TH>번호</TH></TR> <TR> <TD> <a href="list.php?action=delete&id=1">[1]</a> </TD> </TR> <TR> <TD> <a href="list.php?action=delete&id=2">[2]</a> </TD> </TR> <!-- id=3~6도 같은 패턴으로 반복 --> </TABLE> </BODY>
실제 출력 미리보기
delete.html 화면
삭제 번호를 클릭하세요.
번호
[1]
[2]
[3]
[4]
[5]
[6]
[2] 클릭 시 브라우저 주소창
http://localhost/list.php
?action=delete&id=2
→ $_GET['action'] = "delete"
→ $_GET['id'] = "2"
→ list.php에서 id=2 DELETE 실행
용어 핵심 용어 정리
쿼리 문자열URL의 ? 이후 부분. key=value 형태로 데이터를 전달. 여러 값은 &로 연결
href 파라미터앵커 링크의 목적지 URL에 쿼리 문자열 포함. 클릭 시 GET 방식으로 서버에 전송
action 파라미터어떤 작업을 수행할지 알려주는 GET 파라미터. delete/edit/view 등 값으로 서버 측 분기
id 파라미터어떤 데이터를 대상으로 할지 지정하는 식별자. ?id=2는 id=2인 행에 액션 적용
&amp; (HTML 인코딩)HTML 속성 안에서 &는 &amp;로 써야 문법적으로 올바름. 브라우저는 동일하게 처리
GET 방식데이터가 URL에 노출됨. 링크/폼의 기본 전송 방식. 북마크·공유 가능하나 민감 데이터엔 부적합
정적 HTML서버 측 언어 없이 순수 HTML만으로 구성. 번호별 링크를 수동으로 나열한 교육용 패턴
PHP 동적 생성실제 서비스에서는 DB 목록을 while+fetch로 꺼내 href에 $row['id']를 동적으로 삽입

1 ?action=delete&id=N — 쿼리 문자열의 구조

URL에서 ?는 경로 끝과 파라미터 시작을 구분한다. 이후 key=value 형태로 데이터를 쓰고, 여러 개는 &로 연결한다. PHP에서는 이 파라미터들이 $_GET 배열에 자동으로 담긴다.

list.php?action=delete&id=2 // ^^^^^^ key ^^^^^^ value // ^^ 두 번째 파라미터 // ^ key ^ value // PHP에서 자동으로 $_GET['action'] === "delete" $_GET['id'] === "2" // 주의: 문자열로 들어옴
※ $_GET['id']는 문자열 "2"로 들어온다. PHP에서 숫자 비교 시 자동 형변환되어 2 > 0 조건이 작동하지만, bindValue에서 PARAM_INT를 쓰면 내부적으로 정수로 처리된다.

2 &amp; vs & — HTML 속성 안에서의 차이

HTML 문법에서 &는 특수 문자 시작(엔티티)을 의미한다. href 속성 안에 &를 그대로 쓰면 W3C 유효성 검사에서 오류가 발생하고 일부 파서가 잘못 해석할 수 있다. 올바른 방법은 &amp;로 이스케이프하는 것이다. 브라우저는 &amp;&로 해석해 서버에 전달하므로 동작은 같다.

권장하지 않음 (동작하지만 비표준)
href="list.php?action=delete&id=1"
// W3C 유효성 오류
// 일부 파서에서 &id를 엔티티로 해석 시도
표준 방식 (HTML 엔티티 이스케이프)
href="list.php?action=delete&id=1"
// 브라우저가 &amp; → & 변환 후 전달
// W3C 표준 준수

3 정적 HTML vs 동적 PHP — 왜 교육 코드는 수동으로 번호를 나열하는가

delete.html은 [1]~[6]을 수동으로 HTML에 하드코딩했다. 데이터가 늘어나면 HTML을 직접 수정해야 한다. 실제 서비스에서는 PHP로 DB 목록을 조회해 while+fetch 루프로 동적으로 생성한다. 교육 단계에서는 GET 파라미터 개념 자체에 집중하기 위해 정적 HTML을 사용한 것이다.

정적 HTML — 교육용 단순 패턴
<a href="list.php?action=delete&id=1">[1]</a>
<a href="list.php?action=delete&id=2">[2]</a>
<a href="list.php?action=delete&id=3">[3]</a>
// DB 변경 시 HTML 직접 수정 필요
동적 PHP — 실제 서비스 패턴
while($row = $stmh->fetch(FETCH_ASSOC)) {
  $id = $row['id'];
  echo "<a href='list.php?action=delete&id=$id'>[$id]</a>";
}
// DB 데이터에 따라 자동 생성

 

반응형

 

4 GET 파라미터로 액션 전달 — 다른 용도로도 쓰이는 패턴

?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 '%홍%' 쿼리 실행

5 링크 클릭 시 전체 흐름 — delete.html → list.php
1
delete.html에서 [2] 링크 클릭브라우저가 href="list.php?action=delete&id=2"로 GET 요청 전송
2
list.php 시작 — DB 접속require_once("MYDB.php"); $pdo = db_connect();
3
GET 파라미터 확인isset($_GET['action']) && $_GET['action']=='delete' && $_GET['id']>0 → 모두 참
4
DELETE FROM member WHERE id = 2 실행beginTransaction → prepare → bindValue(':id', 2) → execute → commit
5
전체 목록 SELECT 후 출력id=2가 없는 목록이 표로 출력됨 — 삭제 결과 즉시 반영

6 보안 고려사항 — GET으로 삭제를 처리할 때의 위험

delete.html의 링크 패턴은 교육용으로 이해하기 쉽지만, 실제 서비스에 그대로 적용하면 위험하다. URL이 외부에 노출되면 누구나 해당 URL로 접속해 데이터를 삭제할 수 있다. 이메일이나 SNS에 링크가 공유되거나, 검색 엔진이 크롤링하다가 삭제가 실행될 수 있다.

실제 서비스에서 삭제를 안전하게 구현하려면
  • POST 방식 사용: <form method="post"> + <button> — 링크로 접근 불가
  • CSRF 토큰: 폼에 서버가 발급한 임의 토큰 포함 — 외부 요청 차단
  • 인증 확인: 로그인 사용자만 삭제 가능하도록 권한 검사
  • 확인 단계: JavaScript confirm() 또는 별도 확인 페이지

7 자주 하는 실수
실수 증상 해결
href에 &를 &amp; 없이 사용 W3C 유효성 오류 / 일부 파서 오작동 href 속성 안에서는 &를 &amp;로 이스케이프
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 목록으로 화이트리스트 검증

핵심 한 줄 요약

?action=delete&id=N앵커 링크에 쿼리 문자열 담기 — 클릭하면 GET으로 서버에 전달
&amp;HTML 속성 안에서 &는 &amp;로 이스케이프 — 브라우저가 &로 복원 후 전송
$_GET['action'], $_GET['id']서버에서 쿼리 문자열 파라미터를 배열로 수신 — isset()으로 존재 확인 필수
정적 HTML의 한계번호 하드코딩 — 실제 서비스는 while+fetch로 동적 생성
GET으로 삭제교육용 단순 패턴 — 실제 서비스는 POST + 인증 + CSRF 토큰 필수

Tags

#PHP #HTML #GET파라미터 #쿼리문자열 #앵커링크 #삭제링크 #href #action #URL파라미터 #$_GET #isset #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, HTML, GET파라미터, 쿼리문자열, 앵커링크, 삭제링크, href, action, URL파라미터, $_GET
반응형

댓글