본문 바로가기
Infra & Security Eng/Database Engineering

conn,i d, check, logout, st_in, st_vi 파일을 활용한 웹 데이터베이스 연동 프로그래밍과 해석해보기

by 엔지니어 E 2026. 3. 31.
반응형

[계정 및 인증 관리]


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>&nbsp;&nbsp;<input type="text" name="id"></td>
    </tr>
* tr: 표에서 한 줄(행)을 만들 때 사용
* <td width="50">: 한 줄 안에서 칸을 나눔. 여기서는 제목(ID, passwd)이 들어갈 50 크기의 칸
* &nbsp;: 입력창 앞에 약간의 여백(띄어쓰기)을 주어 답답하지 않게 만듦
* <input type="text" name="id">: 아이디를 적을 수 있는 일반 텍스트 입력창을 만듦.서버에서는 이걸 id라는 이름으로 구별함
    <tr>
        <td width="50"><p align="center">passwd</p></td>
        <td>&nbsp;&nbsp;<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>&nbsp;&nbsp;<input type="text" name="id"></td>
    </tr>
    <tr>
        <td width="50"><p align="center">passwd</p></td>
        <td>&nbsp;&nbsp;<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 종료: 모든 작업이 끝났으므로 데이터베이스와의 연결을 끊음