반응형




[계정 및 인증 관리]![]() ![]() id.html / id.php (회원가입) 역할: 사용자 정보를 DB에 최초 저장하고 접속 권한(세션)을 생성함 명령어 이유: md5()는 보안을 위해 비밀번호를 암호화하며, $_SESSION["id"]는 가입 직후 바로 서비스 이용이 가능하도록 인증 증표를 메모리에 생성함 check.html / check.php (로그인) - 전달받은 데이터를 DB에 저장함 역할: 입력한 정보와 DB 정보를 대조하여 일치할 경우에만 접속 권한을 부여함 명령어 이유: oci_fetch_all()로 조회된 행의 개수가 '1'인지 확인하여 정확히 일치하는 계정이 있을 때만 세션을 발급함 logout.php (로그아웃) 역할: 생성된 접속 권한을 파괴하여 보안 페이지 접근을 차단함 명령어 이유: session_destroy()는 서버 메모리에 저장된 인증 정보를 삭제하여 권한 없는 접근을 물리적으로 막음 [데이터 입력 및 처리] st_in.php (학생 입력) 역할: 로그인된 사용자만 접근하여 새로운 정보를 DB 테이블에 추가함 명령어 이유: if(!isset($_SESSION["id"]))는 권한 없는 사용자를 차단하는 성문 역할을 하며, TO_DATE()는 문자열 데이터를 Oracle의 날짜 데이터 형식으로 변환하여 오류를 방지함 [데이터 조회 및 관리] st_vi.php (데이터 목록 및 검색/삭제) 역할: DB에 저장된 데이터를 조건에 맞게 가져와 화면에 출력하고 삭제 기능을 수행함 명령어 이유: LIKE는 부분 검색을 가능하게 하며, DELETE는 특정 데이터를 식별하여 삭제함. 페이징 변수($start, $scale)는 대량의 데이터를 나누어 출력하여 시스템 부하를 줄임. [공통 연결] conn.php (DB 연결) 역할: 모든 PHP 파일이 Oracle DB와 통신할 수 있는 통로를 개설함 명령어 이유: oci_connect()는 DB 주소, 계정, 암호를 사용하여 물리적인 연결 세션을 수립함 |
id.html 파일
| <html><head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> 계정등록 </title> </head> <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red"> * link/vlink/alink: 링크를 클릭하기 전, 클릭한 후, 클릭하는 순간의 색깔을 각각 정해준다 <form name="id" action="id.php" method="POST"> * <form name="id"...>: 이 영역에 적힌 내용들을 하나의 '묶음'으로 관리하겠다는 선언 * action="id.php": '확인' 버튼을 눌렀을 때, 입력한 데이터들을 id.php라는 파일로 던져주라는 명령어 * method="POST": 데이터를 보낼 때 주소창에 노출하지 않고 '편지봉투'에 담듯 숨겨서 안전하게 보내라는 방식 <center> * 입력창들이 화면 정중앙에 오도록 정렬해 주는 태그 <table border="0" width="250"> * <table border="0" width="250">: 입력칸들이 삐뚤빼뚤하지 않게 가로 250 크기의 투명한 표 안에 가두어 정렬 <tr> <td width="50"><p align="center">ID</p></td> <td> <input type="text" name="id"></td> </tr> * tr: 표에서 한 줄(행)을 만들 때 사용 * <td width="50">: 한 줄 안에서 칸을 나눔. 여기서는 제목(ID, passwd)이 들어갈 50 크기의 칸 * : 입력창 앞에 약간의 여백(띄어쓰기)을 주어 답답하지 않게 만듦 * <input type="text" name="id">: 아이디를 적을 수 있는 일반 텍스트 입력창을 만듦.서버에서는 이걸 id라는 이름으로 구별함 <tr> <td width="50"><p align="center">passwd</p></td> <td> <input type="password" name="passwd"></td> * <input type="password" <input type="password" name="passwd">: 비밀번호 입력창임. 글자를 치면 별표(*)로 가려지게 해서 보안을 유지함 </tr> <tr> <td colspan="2"> * <td colspan="2">: 아래쪽 '확인' 버튼이 들어갈 칸을 두 칸 분량으로 넓게 합쳐줌 <p align="center"><input type="submit" name="확인" value="확인"></p> * <input type="submit" value="확인">: 이 버튼을 누르는 순간, 위에서 설정한 id.php로 모든 데이터가 전송(제출)됨 </td> </tr> </table> </form> </body></html> |
id.php 파일
| <?php session_start(); - "이제부터 세션(로그인 상태 유지 정보)을 사용하겠다"는 선언임 require('conn.php'); - DB 접속 정보가 담긴 외부 파일을 불러옴 접속을 시도해야 데이터를 넣을 수 있기 때문 $id = $_POST["id"]; - 앞서 만든 HTML 폼에서 'id'라는 이름으로 보낸 글자를 가져와 $id 변수에 담는다 $passwd = $_POST["passwd"]; - 마찬가지로 비밀번호 입력값을 가져옴 $hash_passwd = md5($passwd); - 비밀번호를 그대로 저장하면 위험하므로, md5 알고리즘으로 암호화하여 복잡한 문자열로 바꿈 $sql = "INSERT INTO id (id, passwd) VALUES ('$id', '$hash_passwd')"; * "DB에 있는 id라는 표의 id 칸과 passwd 칸에, 내가 방금 입력받은 아이디($id)와 암호화된 비번($hash_passwd)을 한 줄 추가해달라는 명령어 $result = oci_parse($conn, $sql); - Oracle DB가 이 명령문을 실행할 수 있도록 검사하고 준비시키는 과정 $re = @oci_execute($result); - 실제로 DB에 데이터를 집어넣는 실행 단계. 앞에 @를 붙이면 에러가 나더라도 화면에 지저분하게 뜨지 않게 막아줌 if(!$re) { - 만약 DB에 데이터를 넣는 데 실패했다면 실행됨 echo "<script> window.alert('계정 등록 장애입니다. 아이디가 중복되었거나 DB 연결을 확인하세요.'); - 등록 장애"라는 경고창을 띄워 사용자에게 알림 history.go(-1); - 다시 입력하던 이전 화면으로 되돌려 보냄 </script>"; exit; - 에러가 났으니 아래 코드를 실행하지 말고 여기서 멈추라는 명령 } else { - 저장이 성공했다면 실행됨 $_SESSION["id"] = $id; - 가입과 동시에 "이 사람은 로그인된 상태다"라고 서버에 기록(세션 생성)을 남김 oci_commit($conn); - DB에 넣은 데이터를 최종적으로 확정(저장) 짓는 도장을 찍는 작업 echo "<script> alert('회원가입 및 로그인이 완료되었습니다!'); location.href='st_vi.php'; - 가입 완료 후 학생 목록 창(st_vi.php)으로 화면을 이동시킴 </script>"; } oci_free_statement($result); - 사용이 끝난 메모리를 비워주어 시스템이 느려지지 않게 함 oci_close($conn); - DB와의 연결 통로를 닫고 안전하게 종료함 ?> |
check.html 파일
| <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> login </title> </head> <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red"> <form name="login" action="check.php" method="POST"> <center> <table border="0" width="250"> <tr> <td width="50"><p align="center">ID</p></td> <td> <input type="text" name="id"></td> </tr> <tr> <td width="50"><p align="center">passwd</p></td> <td> <input type="password" name="passwd"></td> </tr> <tr> <td colspan="2"> <p align="center"><input type="submit" name="확인" value="확인"></p> </td> </tr> </table> </center> </form> </body> </html> * id.html 화면 출력코드랑 같아서 action="check.php" 부분만 수정해주면 됨 |
check.php 파일
| <?php session_start(); - 서버 메모리에 접속자의 세션을 기록할 준비를 함 require('conn.php'); - Oracle DB와 연결된 파일을 불러옴 $id = $_POST["id"]; - check.html의 id 칸에 입력된 값을 가져와 변수에 저장 $passwd = $_POST["passwd"]; - check.html의 passwd 칸에 입력된 값을 가져와 변수에 저장 $hash_passwd = md5($passwd); - 입력받은 비밀번호를 DB에 저장된 것과 똑같이 암호화함 [sql 작성] $sql = "SELECT * FROM id WHERE id = '$id' AND passwd = '$hash_passwd'"; * id 테이블에서 **id**와 **비밀번호**가 사용자가 입력한 값과 모두 일치하는 데이터를 전부 찾으라는 명령어 $result = oci_parse($conn, $sql); - 작성한 SQL 명령어를 DB가 이해할 수 있게 분석함 oci_execute($result); - 분석된 SQL 명령어를 DB 서버에서 실제로 실행함 $row_num = oci_fetch_all($result, $row); - 실행 결과로 나온 데이터가 총 몇 줄인지 숫자로 세어줌 if ($row_num == 1) { - 일치하는 데이터가 딱 1개 있다면 (로그인 성공 조건) $_SESSION["id"] = $id; - 가입과 동시에 "이 사람은 로그인된 상태다"라고 서버에 기록(세션 생성)을 남김 echo "<script> alert('로그인 성공!'); - 화면에 성공 알림창을 띄움 location.href='st_vi.php'; - 인증된 상태로 전체보기(st_vi.php) 페이지로 이동함 </script>"; } else { - 로그인 실패 시 출력되는 화면 echo "<script> alert('아이디 또는 비밀번호가 틀립니다.'); - 화면에 해당 알림창을 띄움 history.go(-1); - 다시 입력하던 이전 화면으로 되돌려 보냄 </script>"; } oci_free_statement($result); - 사용이 끝난 메모리를 비워주어 시스템이 느려지지 않게 함 oci_close($conn); - DB와의 연결 통로를 닫고 안전하게 종료함 ?> |
logout.php 파일
| <?php session_start(); - 세션 활성화: 현재 접속 중인 사용자의 세션 정보를 서버 메모리에 올림 session_unset(); - 데이터 삭제: 사용자가 들고 있던 로그인 정보(ID 등)를 모두 지움 session_destroy(); - 세션 종료: 서버 측 세션 데이터를 완전히 파기함 echo "<script> alert('로그아웃 되었습니다. 로그인 화면으로 돌아갑니다.'); location.href='check.html'; - 사용자가 확인을 누르면 즉시 check.html로 화면을 전환함 </script>"; ?> |
st_in.html 파일
| <?php session_start(); - 세션 시작: 브라우저와 서버 간의 연결 상태(로그인 등)를 확인하기 위해 세션을 활성화함 if(!isset($_SESSION["id"])) { - 로그인 체크: 세션에 저장된 "id" 값이 없으면(로그인 안 된 상태) 경고창을 띄우고 이전 페이지로 되돌림 echo "<script> alert('로그인이 필요합니다.'); - 알림창 출력 history.back(); - 브라우저의 이전 페이지로 이동 </script>"; exit;- 로그인이 안 되어 있으면 아래의 DB 저장 로직을 실행하지 않고 여기서 프로그램 종료 } header('Content-Type: text/html; charset=utf-8'); - 헤더 설정: 브라우저에게 이 파일이 UTF-8 방식의 한글 HTML 문서임을 알려줌 (한글 깨짐 방지) require('conn.php'); - DB 연결 파일 불러오기: Oracle 데이터베이스 연결 정보가 담긴 'conn.php' 파일을 가져옴 POST 데이터 수신 - st_in.html의 폼(Form)에서 입력받아 전달된 값들을 변수에 저장 $st_id = $_POST["st_id"]; // 학번 $st_name = $_POST["st_name"]; // 이름 $gender = $_POST["gender"]; // 성별 $grade = $_POST["grade"]; // 학년 $dept = $_POST["dept"]; // 학과 $score = $_POST["score"]; // 평점 $sql = "INSERT INTO student (sno, sname, sex, syear, major, avr) VALUES ('$st_id', '$st_name', '$gender', '$grade', '$dept', '$score')"; * SQL문 작성: student 테이블에 데이터를 삽입(INSERT)하기 위한 명령어를 문자열로 만듦 $result = oci_parse($conn, $sql); * Oracle 실행 준비: 작성한 SQL문을 오라클 서버가 이해할 수 있도록 파싱(해석)함 $success = oci_execute($result); - Oracle 실행: 실제로 DB에 데이터를 집어넣음. 성공하면 true, 실패하면 false를 반환 if($success) { - 결과 처리 및 이동: DB 입력 성공 여부에 따라 사용자에게 알림을 보여줌 echo "<script> alert('정상 입력 되었습니다.'); - 저장 성공 시 메시지 location.href='st_vi.php'; - 성공 후 전체 목록 보기 페이지로 이동 </script>"; } else { echo "저장 실패"; - SQL 문법 오류나 제약 조건 위반 등으로 저장되지 않았을 때 출력 } oci_free_statement($result); - 결과 변수 메모리 해제 oci_close($conn); -DB 연결 종료 echo "<hr>"; - 화면에 수평선 출력 show_source(__FILE__); - 현재 이 파일(st_in.php)의 소스 코드를 화면에 그대로 보여줌 ?> |
st_vi.php 파일
| <?php session_start(); - 세션 시작: 로그인 상태(아이디 등)를 확인하거나 저장하기 위해 세션 기능을 활성화함 header('Content-Type: text/html; charset=utf-8'); - 헤더 설정: 웹 브라우저에 이 화면이 한글(UTF-8)을 사용하는 HTML임을 알려줌 require('conn.php'); - DB 연결:Oracle 데이터베이스 접속 정보가 담긴 외부 파일을 현재 코드에 포함시킴 1. 상단 메뉴 출력 (로그인 여부에 따라 메뉴 변경) echo "<div style='text-align:center;'>"; if(!isset($_SESSION["id"])) - 로그인 체크: 세션에 저장된 id가 없으면 로그인 안 됨 echo "<a href='./id.html'>계정등록</a> | <a href='./check.html'>login</a>"; - 회원가입과 로그인 링크 출력 } else { - 로그인 된 상태라면 echo "<a href='./st_in.html'>자료 입력하기</a> | <a href='./logout.php'>logout</a> | <a href='./st_vi.php'>처음으로</a>"; - 입력/로그아웃/처음으로 링크 출력 } echo "</div><hr>"; 2. 삭제 처리 $del = isset($_GET['del']) ? $_GET['del'] : ""; - URL에 'del'(학번) 값이 있으면 가져오고, 없으면 빈 값 처리 if (!empty($del)) { - 삭제할 학번 데이터가 존재한다면 $sql_del = "DELETE FROM student WHERE sno = '$del'"; - SQL 생성: 특정 학번의 데이터를 삭제하는 명령어 작성 $result_del = oci_parse($conn, $sql_del); - SQL 해석: 오라클 서버가 삭제 명령어를 이해할 수 있게 준비함 oci_execute($result_del); - 실행: 실제로 DB에서 해당 데이터를 삭제함 oci_free_statement($result_del); - 자원 해제: 삭제 실행에 사용된 메모리 공간을 비움 } 3. 검색어 설정 $search = isset($_POST['search']) ? $_POST['search'] : (isset($_GET['search']) ? $_GET['search'] : ""); * 검색 버튼을 눌렀을 때(POST)나 페이지를 이동할 때(GET) 전달된 검색어를 $search 변수에 저장함 * 사용자가 **검색창에 직접 입력하여 보낸 값(POST)**이나 페이지 번호를 클릭하여 주소창에 실려 온 값(GET) 중 존재하는 데이터를 찾아 $search 변수에 할당하는 코드 4. SQL 구성 if (empty($search)) { - 검색어가 없으면 $sql = "SELECT sno, sname, sex, major, syear, TO_CHAR(avr, '0.00') AS avr FROM student ORDER BY sno ASC"; - 전체 학생 목록을 학번 순으로 가져오는 SQL문 } else { - 검색어가 있으면 $sql = "SELECT sno, sname, sex, major, syear, TO_CHAR(avr, '0.00') AS avr FROM student WHERE sname LIKE '%$search%' OR major LIKE '%$search%' ORDER BY sno ASC"; - 이름이나 학과에 검색어가 포함된 학생만 찾는 SQL문 } 5. 데이터 읽기 $result = oci_parse($conn, $sql); - SQL 해석: 조회용 SQL문을 실행할 수 있게 준비함 oci_execute($result); - 실행: DB에서 데이터를 검색함 $row_num = oci_fetch_all($result, $row); - 결과 수집: 검색된 모든 데이터를 $row 배열에 저장하고 전체 개수를 $row_num에 담음 oci_free_statement($result); - 자원 해제: 조회 실행에 사용된 메모리 공간을 비움 6. 페이징 계산 $scale = 5; - 한 페이지에 보여줄 데이터 줄 수 설정 $start = isset($_GET['start']) ? (int)$_GET['start'] : 0; - 몇 번째 데이터부터 보여줄지 시작 번호를 가져옴 (기본값 0) * 웹브라우저 주소창(GET)을 통해 전달된 **시작 데이터의 순번(start)**이 있으면 그 숫자를 정수 형태로 가져오고, 만약 전달된 값이 없으면 첫 번째 데이터인 0을 $start 변수에 저장하는 코드 7. 검색창 출력 echo("<div style='text-align:center; margin-bottom:20px;'> <form method='post' action='./st_vi.php'> 학생이름 또는 학과 검색: <input type='text' name='search' value='$search'> <input type='submit' value='확인'> </form> </div>"); echo("<p align='center'>조회된 학생 수는 $row_num 명입니다.</p>"); - 전체 검색 결과 수 표시 8. 데이터 테이블 출력 echo("<table border='1' align='center' width='80%' style='border-collapse:collapse; text-align:center;'>"); echo("<tr bgcolor='#f2f2f2'> <th>학번</th><th>이름</th><th>성별</th><th>학과</th><th>학년</th><th>평점</th><th>삭제</th> </tr>"); * 현재 시작 번호($start)부터 설정한 개수($scale)만큼 반복해서 표의 줄(tr)을 만듦 for($i = $start; $i < ($start + $scale); $i++) { if($i < $row_num) { - 데이터가 있는 번호까지만 출력 echo("<tr> <td>{$row['SNO'][$i]}</td> <td>{$row['SNAME'][$i]}</td> <td>{$row['SEX'][$i]}</td> <td>{$row['MAJOR'][$i]}</td> <td>{$row['SYEAR'][$i]}</td> <td>{$row['AVR'][$i]}</td> <td><a href='./st_vi.php?del={$row['SNO'][$i]}&start=$start&search=$search'>del</a></td> </tr>"); } } echo("</table>"); 9. 페이징 버튼 생성 echo("<div style='text-align:center; margin-top:20px;'>"); $total_pages = ceil($row_num / $scale); - 전체 페이지 수 계산 (나머지가 있으면 올림) $current_page = ($start / $scale) + 1; - 현재 내가 보고 있는 페이지 번호 계산 $page_limit = 5; - 화면 하단에 한 번에 보여줄 페이지 번호 개수 (예: [1]~[5]) * 현재 페이지 블록의 시작 번호와 끝 번호 계산 (예: 1~5, 6~10) $start_page = (floor(($current_page - 1) / $page_limit) * $page_limit) + 1; $end_page = $start_page + $page_limit - 1; if ($end_page > $total_pages) $end_page = $total_pages; -실제 마지막 페이지를 넘지 않게 조절 * [이전] 링크: 이전 데이터 블록으로 이동 $p = $start - $scale; if($p >= 0) { echo("<a href='./st_vi.php?start=$p&search=$search'>[이전]</a> "); } * 숫자 페이지 링크: 각 페이지 번호를 순회하며 링크 생성 for ($j = $start_page; $j <= $end_page; $j++) { $next_start = ($j - 1) * $scale; // 클릭 시 이동할 데이터 시작 위치 계산 if ($j == $current_page) { echo("<b>[$j]</b> "); // 현재 보고 있는 페이지는 굵게 표시 } else { echo("<a href='./st_vi.php?start=$next_start&search=$search'>[$j]</a> "); - 다른 페이지는 클릭 가능한 링크로 표시 } } * [다음] 링크: 다음 데이터 블록이 있으면 이동 링크 표시 $n = $start + $scale; if($n < $row_num) { echo("<a href='./st_vi.php?start=$n&search=$search'>[다음]</a>"); } echo("</div><hr>"); oci_close($conn); - DB 종료: 모든 작업이 끝났으므로 데이터베이스와의 연결을 끊음 |
'Infra & Security Eng > Database Engineering' 카테고리의 다른 글
| view, content, insert, id.html 4가지 웹페이지 파일 모델링 실습, 해설 (0) | 2026.04.02 |
|---|---|
| 페이지 구현 파일(id,conn, co_in, sc_vi.php) 파일 관계 구조, 패턴 설명, 명령어 해석하기 (0) | 2026.04.01 |
| ERwin 차량운행일지 정규화 3단계 실습_0327_1 (0) | 2026.03.27 |
| 오라클 클라이언트(Client), 아파치(Apache), PHP, 삼바(Samba) 서버 설치, 설정, 연동까지 완벽 가이드 (0) | 2026.03.27 |
| 웹 게시판의 화면 단위 출력(Pagination)실습, 로직 분석하기 (0) | 2026.03.26 |

