본문 바로가기

PHP/PHP Programming

[PHP] 성적 관리 프로그램 제작

반응형

다섯 과목의 점수를 입력해 합계와 평균을 구하고, 이 데이터를 저장 / 읽기 / 삭제 등의 가능한 성적 관리 프로그램을 다음과 같은 단계를 거쳐 제작한다.



 ① 데이터베이스 테이블 설계

 ② 데이터베이스 테이블 생성
 ③ 데이터베이스 테이블 생성
 ④ 레코드 삭제 프로그램 작성



01. 데이터베이스 테이블 설계


 성적 관리 프로그램의 데이터베이스에 저장하고 관리할 데이터 항목을 설계해보자. 일련번호, 이름을 비롯해 다섯 과목의 점수 등이 포함될 것이다. 필드명과 타입 등을 정리하면 다음과 같다.


필드명

타입

추가 사항

설명

 num
 int

 not null, auto_increment, primary key

 일련번호
 name
 varchar(12)

 

 학생의 이름
 sub01
 int

 

 과목1의 점수
 sub02
 int

 

 과목2의 점수
 sub03

 int

 

 과목3의 점수
 sub04
 int

 

 과목4의 점수
 sub05
 int

 

 과목5의 점수

 sum

 int

 

 합계

 avg
 float

 

 평균



 일련번호에 해당하는 num 필드의 기본 타입은 정수형으로 옵션에는 필수 항목(not null), 자동 증가(auto_increment), 기본키(primay key)가 설정된다. 학생의 이름이 저장되는 naem 필드는 문자(char)형이고, 폭은 12Byte다. sub01, sub02, sub03, sub04, sub05 필드에 각 과목의 점수가 저장되고, 필드 타입은 정수형이다. sum 필드에는 다섯 과목 점수의 합계가 저장되고, 필드 타입은 각 과목의 점수와 마찬가지로 정수형이다. 평균을 나타내는 avg 필드에는 소수점 형태로 값이 저장되기 때문에 float 형으로 선언한다.







02. 데이터베이스 테이블 생성


 앞에서 설계한 구조를 가지는 데이터베이스 테이블을 생성하는 SQL 명령은 다음과 같이 작성할 수 있다.




이 명령문을 PHP 프로그램으로 만들면 다음과 같다.

 stud_score.php

 



6 ~ 16행에서 데이터베이스 테이블을 생성하는 명령을 변수 $SQL에 저장한 다음, 18행에서 mysql_query( ) 함수를 이용해 $sql에 저장된 명령을 실행한다.


20행에서 if문으로 데이터베이스 테이블 생성 명령이 제대로 실행되었는지 확인한다. 테이블이 생성되어 $result값이 TRUE라면 22행이 실행되고 실행 결과는 '테이블 생성 성공' 이미지와 같다. 만약 테이블 생성에 실패하면 26행이 실행되고, 실행 결과는 '테이블 생성 실패'와 같다.


① 3, 4행에서 계정 정보나 데이터베이스명을 다르게 입력하여, 계정에 접속할 수 없거나 접속하는 데이터베이스를 잘못 선택했을 수 있다.

② 6 ~ 16행에서 테이블을 만드는 SQL 명령에 오타가 있을 수 있다.

③ 이미 stud_score라는 이름의 데이터베이스 테이블이 존재하는 경우, 다시 테이블을 생성하려고 하면 테이블명이 중복되기 때문에 테이블 생성에 실패하게 된다.


제대로 테이블이 생성되었는지 명령 프롬프트로 계정에 접속하여 확인해 보자.



 mysql> show tables;


 mysql> desc stud_score;


  설계한 내용과 비교해 틀린 것이 없는지 확인한다. 만약 잘못 입력했다면 drop table 명령으로 데이터베이스 테이블을 삭제한 다음, 에러를 수정해 데이터베이스 테이블을 다시 만든다.





03. 성적 관리 프로그램 작성


 데이터베이스를 구축했으면, 성적 관리 프로그램을 만들어보자, 실행할 때 점수를 잘못 입력해 삭제하는 경우도 발생할 수 있으므로 두개의 페이지를 작성해야한다.


 score_list.php

 출력 화면

 



01. 데이터베이스 접속 및 선택

4, 7행 mysql_connect( ) 함수로 DB계정에 접속하고, mysql_select_db( ) 함수로 DB를 선택한다.



02. 성적 입력

다음과 같이 실제로 학생의 이름과 다섯 과목의 점수를 입력한 다음 [입력하기]를 클릭한다.

22행 <from>의 action 속성은 "score_list.php?mode=insert"로 설정되어 있다. 이름과 점수를 입력하고 [입력하기]를 클릭하면, action의 설정대로 현재 웹 페이지인 score_list.php로 이동하면서 변수 $mode값으로 insert가 post 방식으로 전달된다.


9 ~ 12행 [입력하기] 버튼을 클릭하면 $mode값은 insert가 된다. 따라서 9행의 if문 조건식을 만족해 11행에서 다섯 과목 점수의 합계를 $sum에 입력하고, 12행에서 평균을 $avg에 입력한다.

14, 15행 stud_score 테이블에 이름, 다섯 과목의 점수, 합계 평균을 삽입하는 SQL 명령을 $sql에 입력한다. num 필드에서 자동 증가 옵션을 설정했기 때문에 데이터를 입력할 필요가 없다. insert into 명령으로 레코드 삽입 후 필드값이 자동으로 증가되고, 다음 레코드를 삽입 할 때 그 값을 사용한다.

17행 $sql에 입력된 SQL 명령을 mysql_query( ) 함수를 이용해 실행한다.





03. 레코드 출력 : 레코드에 저장된 값은 62 ~ 77행을 통해 출력된다.

62 ~ 77행 if ~ else ~ else문을 이용하여 상황에 따라 실행시킬 SQL 명령을 $sql에 입력한다. 정렬 링크를 클릭하지 않고, [입력하기]를 클릭하여 데이터를 추가하면 $mode값이 insert로 설정되므로 어떤 경우에도 속하지 않아 74행의 명령이 저장된다. $sql에 저장된 명령은 77행의 mysql_query( ) 함수를 통해 실행된다.

79행 화면에 표시되는 번호를 나타내는 $count를 1로 초기화 시킨다.

82행 while문의 조건식에 사용된 mysql_fetch_array($result) 함수는 앞에서 살펴봤듯이, select문 실행 결과가 저당된 $result에서 레코드를 하나씩 가져와 $row에 저장한다.

84행 평균값을 소수점 첫째 자리까지 구하기 위해 round( )함수를 사용한다. 위의 출력결과를 보면, 평균이 소수점 첫째 자리까지 표신된 것을 알 수 있다.

88 ~ 99행 화면에 표시되는 레코드의 순서(번호)를 비롯해 학생의 이름, 다섯 과목의 점수, 합계, 평균을 출력하고, [삭제]링크도 표시한다.



04. 성적순 정렬과 성적역순 정렬

42행 [성적순 정렬]은 score_list.php?mode=big_first와 [성적역순 정렬]은 socre_list.php?mode=small_first와 연결된다. [성적순 정렬]을 킬력하면 score_list.php로 이동하면서 $mode 값으로 big_firest가 전달되고, 반대로 [성적역순 정렬]을 클릭하면 $mode값으로 small_first가 전달된다.

62 ~ 77행 $mode값이 big_first인 경우에는 64행에서 내림 차순으로 레코드를 정렬하는 명령이 $sql에 저장되며, $mode값이 small_first인 경우에는 67행에서 오름차순으로 레코드를 정렬하는 명령이 $sql에 저장된다. $sql에 저장된 명령은 77행에서 mysql_query( ) 함수를 통해 실행된다.


05. [삭제]링크

98행 [삭제]를 클릭하면 score_delete.php에서 해당 레코드를 삭제하는데, 삭제할 레코드의 정보를 GET 방식으로 전달한다. 86행에서 변수 $sum에 저장한 레코드의 일련번호를 98행의 score_delete.php?num=$num를 통해 score_delete.php에 전달한다.





04. 레코드 삭제 프로그램 작성


 score_delete.php

 

 



01. 데이터베이스 접속 및 선택

3, 4행 함수를 이용해 데이터베이스 계정에 접속하고 데이터베이스를 선택한다.


02. 레코드 삭제

7, 8행 score_list.php에서 [삭제]를 클릭혀만 $num값이 전달된다. 이 레코드 일련버호를 이용하여 해당 레코드를 삭제한다.


03. 성적관리 메인 프로그램

13행 Header 함수는 인자에서 표신된 URL로 이동한다. 즉 레코드를 삭제한 후 다시 현재 페이지인 score_list.php로 되돌아간다. 다만 Header( ) 함수를 사용하기 전에 echo문이나 다른 HTML 태그를 내보내서는 절대로 안 된다. 혹은 Header( )함수 앞에 공백이 들어가 에러가 발생할 수 있으므로 주의한다.

반응형