일일 정리

PHP - 오라클 DB 연동, 논리 모델링 구성

mysecurity 2025. 3. 25. 17:08

목차

1. PHP - 오라클 DB 연동

1-1 다양한 기능 추가(화면 단위 출력, 관계를 가진 테이블 입출력)

 

2. 논리 모델링 구성

2-1 식별자

 

 

1. PHP - 오라클 DB 연동

1-1 다양한 기능 추가(화면 단위 출력, 관계를 가진 테이블 입출력)

● 화면 단위 출력

많은 양의 행을 출력할 경우 한 화면에 출력된다면 보기가 힘드므로 다음과 같이 한 화면에 출력될 행의 개수를 제한하여 이전/다음 버튼으로 화면을 넘어갈 수 있도록 개선할 수 있다.

// st_vi.php 화면 단위 출력 추가 //

<html>
    <head>
        <title>st_vi.php</title>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
    </head>
<body>

<?
  echo("<a href=./st_in.html>자료 입력하기</a><hr>");
  require('conn.php');
// =========================== 삭제
$del=$_GET['del']; 
if (empty($del)){}    
else {                             
      $sql="delete from student where sno='$del'"; 
      $result=oci_parse($conn,$sql);
      oci_execute($result);
      oci_free_statement($result);
      } 
// ===========================
// =========================== 검색
$search = $_GET['search'];
if (empty($search))                
   {
    $sql="select sno,sname,sex,major,syear,to_char(avr,'0.00') avr 
          from student order by sno";
   }   
else                                  
   { 
    $sql="select sno,sname,sex,major,syear,to_char(avr,'0.00') avr 
          from student 
          where sname like '%{$search}%' order by sno";
   }
// ===========================
  
  $result=oci_parse($conn,$sql);        
  oci_execute($result);

  $row_num=oci_fetch_all($result, $row);  // $row_num : 전제 행의 수
  oci_free_statement($result);  
  oci_close($conn);
  echo("Row의 개수는 $row_num 입니다.<br><hr>");
 // =========================== 화면 단위 출력
  $scale=5;                           
  $start = $_GET['start'];       
  if (empty($start)){ $start=0;}    
  echo("<table border='0'>");
  for ($i=$start; $i<($start+$scale); $i++) {
    if($i<$row_num){
      echo("
      <tr>
         <td width='50'><p align='center'>{$row['SNO'][$i]}</p></td> 
         <td width='80'><p align='center'>{$row['SNAME'][$i]}</p></td>
         <td width='20'><p align='center'>{$row['SEX'][$i]}</p></td>
         <td width='20'><p align='center'>{$row['SYEAR'][$i]}</p></td>
         <td width='50'><p align='center'>{$row['MAJOR'][$i]}</p></td> 
         <td width='30'><p align='center'>{$row['AVR'][$i]}</p></td>
         <td width='30'><a href=./st_vi.php?del={$row['SNO'][$i]}>del</a></td>
      </tr>
     "); 
}
}       
echo("</table><hr>");
$p=$start-$scale;    
$n=$start+$scale;    
if($p>=0)
echo("<a href=./st_vi.php?start=$p&search=$search>[이전페이지]</a>&nbsp;&nbsp;");
else
echo("이전페이지&nbsp;&nbsp;");

if($n<$row_num)
echo("<a href=./st_vi.php?start=$n&search=$search>[다음페이지]</a>");
else
echo("다음페이지");

?>

<form name='search' method='get' action='st_vi.php'>
검색창 &nbsp;<input type='text' name='search'>
             <input type='submit' name='확인' value='확인'>
</form>
<br><hr><br>
<?  show_source(__FILE__); ?>
</body>
</html>

 

44, 45, 46행 $scale=5;  $start = $_GET['start'];  if (empty($start)){ $start=0;}

: $scale은 화면에 출력할 행의 개수를 나타내며, $start는 내가 출력할 게시물의 시작 번호를 나타낸다. 

: $start에 따로 값을 주지 않으면 $start는 0부터 시작한다. $scale = 5인 경우 $start 값은 0, 5, 10...으로 증가한다.

 

64, 65행 $p=$start-$scale;  $n=$start+$scale;

: $p, $n은 각각 이전 화면의 시작 위치, 다음 화면의 시작 위치를 나타낸다.

 

● 관계를 가진 테이블 입출력

테이블 안의 데이터가 다른 테이블로부터 참조를 받아오는 경우, 마음대로 데이터를 입력할 수 없으므로 다음과 같이 참조할 내용을 검색하고 그중 선택하여 값을 입력하는 프로그램을 작성할 수 있다.

 

※ course 입력 html 파일

// co_in.html //

<html><head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title> course 입력폼 </title>
    </head>
    <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
    <form name="insert" action="co_in.php" method="POST">
    <center>
    <table  border="0" width="300">
      <tr>
         <td width="70"><p align="center">과목번호</p></td>
         <td>&nbsp;&nbsp;<input type="text" name="cno"></td>
      </tr> 
      <tr>
         <td width="70"><p align="center">과목명</p></td>
         <td>&nbsp;&nbsp;<input type="text" name="cname"></td>
      </tr> 
      <tr>
        <td width="70"><p align="center">학점수</p></td>
        <td>&nbsp;&nbsp;1<input type="radio" name="st_num" value="1">,
                2<input type="radio" name="st_num" value="2">,
                3<input type="radio" name="st_num" value="3">,
                4<input type="radio" name="st_num" value="4"></td>
     </tr> 
     <tr>
        <td width="70"><p align="center">교수</p></td>
        <td><select name="pno">
    <?
    require('conn.php');
    $sql="select pno, pname   
          from professor";      
    $result=oci_parse($conn,$sql); 
    oci_execute($result);   
    $row_num=oci_fetch_all($result, $row); 
    oci_free_statement($result);  
    oci_close($conn);
    for ($i=0; $i<$row_num; $i++) {
        echo("<option value='{$row['PNO'][$i]}'>{$row['PNAME'][$i]}</option>");
        }
    ?>
              <option value=""></option>
        </td>
     </tr>    
     <tr>
    <td colspan="2">
            <p align="center"><input type="submit" name="확인" value="확인"></p>
        </td>
     </tr> 
    </table>
    </center>
    </form>
<br><hr><br>
<?  show_source(__FILE__); ?>
</body></html>

 

27 ~ 39행 프로그래밍

: professor 테이블에서 pno와 pname만 검색한 후, option 형태로 pname을 선택하면 해당하는 pno를 저장한다.

 

 

※ course 입력 php 파일

// co_in.php //

<html>
    <head>
        <title>co_in.php</title>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
    </head>
<body>

<?  
  $cno = $_POST['cno'];  
  $cname = $_POST['cname'];
  $st_num = $_POST['st_num'];
  $pno = $_POST['pno'];
  require('conn.php');  
  $sql="insert into course (cno, cname, st_num, pno)
        values ('$cno', '$cname', $st_num, '$pno')";
  $result=oci_parse($conn,$sql);
  $re=@oci_execute($result); 
  oci_free_statement($result);
  oci_close($conn);
  
  if(!$re)
    { echo(" <script>
             window.alert('과목 입력 장애 입니다.');
              history.go(-1);
              </script>
           ");
      exit;
    }
  else
    echo(" <meta http-equiv='Refresh' content = '0; URL=co_vi.php'>");
?>
<br><hr><br>
<?  show_source(__FILE__); ?>
</body>
</html>

course 입력 화면

 

2. 논리 모델링 구성

2-1 식별자

● 식별자 정의

주식별자 - 개체 내의 tuple을 유일하게 구별할 수 있어야 한다. (나머지 속성에 대해서 결정인자이다.)

- 한 개의 속성, 속성의 조합으로 구성된다.

- 데이터의 길이가 짧고 간단해야 한다.
부식별자 - 후보 식별자 중 주식별자로 지정되지 않은 식별자

- Index 구성이 선택되어 질 수 있다.

 

일반 속성은 주식별자에 반드시 함수적 종속관계가 유지되어야 한다.

 

 

주식별자의 규칙

- Uniqueness

- Not null 

- Short

- Simple

 

Uniqueness와 Not null을 만족한다고 주식별자인 것은 아니다.

 

 

외부 식별자

외부 식별자는 두 개체간에 관계를 결정해주는 식별자

 

- Sub entity(하위 테이블)쪽에 정의되며 Super entity(상위 테이블)에 지정된 속성과 동일한 값을 갖는다.

 

- 참조 제약 조건을 생성한다.

: 참조 무결성 : 사원 테이블에서 없는 부서의 정보를 인용하지 못하도록 한다.

 

- 외부 식별자가 sub entity의 주식별자중에 있을 때 이를 식별 관계라고 하고 일반 속성인 경우를 비식별 관계라고 한다.

 

 

외부 식별자 업무 규칙

업무 규칙은 참조 무결성을 확보하기 위해 반드시 정의되어야  한다.

참조 관계의 두 개체에 대한 삽입, 삭제, 변경의 작업이 발생했을 때 참조 관계를 유지하기 위해 정의된다.

입력 규칙 - 의존: 상위 개체에 존재하는 값만 입력한다.

- 자동: 상위 개체에 없는 값이라면 자동으로 입력한다.

- 기본: 입력값이 상위 개체에 없는 경우 미리 지정된 값으로 변경하여 하위 개체에 입력한다.

- 지정: 상위 개체에 없는 경우 일정 조건에 맞는 경우만 입력한다.

- Null: 상위 개체에 없는 경우 null 값으로 변환하여 입력한다.

- 무관: 참조 무결성을 사람에게 맡기고 경고만 한다.
삭제 규칙 - 제한: 상위 개체 삭제 시 하위 개체에 존재하지 않는 값만 삭제한다.

- 연쇄: 상위 개체 삭제 시 연관 하위 개체까지 삭제한다.

- 기본: 상위 개체 삭제 시 연관 하위 개체 값을 기본값으로 변경한다.

- 지정: 상위 개체 삭제 시 일정 조건 만족 시에만 삭제를 허용한다.

- Null: 상위 개체 삭제 시 하위 개체 값을 null 값으로 변경한다.

- 무관: 경고만 한다.
변경 규칙 - 제한: 하위 개체에 존재하지 않는 값만 수정한다.

- 연쇄: 상위 개체 수정 시 연관 하위 개체까지 수정한다.