PHP 프로그래밍

본문 바로가기
사이트 내 전체검색


Web Programming >> PHP Programming
[목차]
제7장 회원관리(MySQL)

    2. 회원 관리 수정(목록, 회원세부내역보기)

1. 목록

바뀐화면은 아래와 같습니다. 이름을 클릭하면, 회원 세부내역보기(viewuser.html)이 연결되고, 아이디를 클릭하면, email이 연결됩니다.

파일명 : list.html

<html>

<head>

   <style type="text/css">

   <!--

   a:link,a:visited,a:active {

      text-decoration : none;

      font-size : 10pt;

   }

   a:hover {

      text-decoration : underline;

      color : red;

      font-size : 10pt;

   }

   BODY, TR, TD, TH {

      font-size : 10pt;

   }

   //-->

   </style>

</head>

<body>

  

<?

########## 데이터베이스 서버에 연결한다. ##########

$dbconn = mysql_connect("localhost","php","php99")

or die("DB서버 연결에 실패하였습니다!");

  

########## 작업 데이터베이스로 sample을 선택한다. ##########

$status = mysql_select_db("sample",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

    

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

### SELECT 쿼리문으로 userdb테이블에 저장되어 있는

###모든 사용자 데이터를 불러온다.

 

$query = "SELECT name,id,email,sex,milage,level FROM userdb ORDER BY id";

$result = mysql_query($query,$dbconn);

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

       

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

$rows = mysql_num_rows($result);

?>

  

<table width=400 border=0 cellpadding=3 align=center>

<tr>

<?

if(!$rows) {

   echo("<td colspan=8 align=center>현재 등록되어 있는

   사용자가 없습니다.</td>");

} else {

?>

   <td colspan=8 align=center>현재 <b><?echo("$rows")?></b>명의

사용자가 등록되어 있습니다.</td>

<?

}

?>

</tr>

<tr>

   <th bgColor=pink align=center>이름</td>

   <th bgColor=pink align=center>아이디</td>

   <th bgColor=pink align=center>성별</td>

</tr>    

  

<?

### 테이블내 모든 레코드의 각 데이터 값을

### 각각의 변수에 저장하여 출력한다.

for($i = 0; $i < $rows; $i ++) {

   $my_name = mysql_result($result,$i,0);

   $my_id = mysql_result($result,$i,1);

   $my_email = mysql_result($result,$i,2);

   $my_sex = mysql_result($result,$i,3);

    

   echo("

      <tr>

         <td bgColor=lightyellow align=center>

         <a href=\"viewuser.html?id=$my_id\">$my_name</a></td>

         <td bgColor=lightyellow align=center>

         <a href=\"mailto:$my_email\">$my_id</a></td>

         <td bgColor=lightyellow align=center>$my_sex</td>

     </tr>

   ");

}

?>

  

</table>

<p align=center>

<a href="adduserform.html">[새로운 사용자 등록]</a>

</p>

  

</body>

</html>

  

<?

########## 데이터베이스 연결을 해제한다. ##########

mysql_close($dbconn);

?>

 

2. 회원 세부내역 보기

회원수정하기(modifyform.html)을 수정하여 만들면 됩니다.

파일명 : viewuser.html

<html>

<head>

   <style type="text/css">

   <!--

   a:link,a:visited,a:active {

      text-decoration : none;

      font-size : 10pt;

   }

   a:hover {

      text-decoration : underline;

      color : red;

      font-size : 10pt;

   }

   BODY, TR, TD, TH {

      font-size : 10pt;

   }

   //-->

   </style>

</head>

<body>

  

<?

########## 데이터베이스 서버에 연결한다. ##########

$dbconn = mysql_connect("localhost","php","php99")

or die("DB서버 연결에 실패하였습니다!");

  

########## 작업 데이터베이스로 sample을 선택한다. ##########

$status = mysql_select_db("sample",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

    

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

########## 수정하고자 하는 사용자의 정보를 뽑아온다. ##########

$query = "SELECT name,id,email,sex,milage,level FROM userdb WHERE id = '$id'";

$result = mysql_query($query,$dbconn);

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

       

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

$my_name = mysql_result($result,0,0);

$my_id = mysql_result($result,0,1);

$my_email = mysql_result($result,0,2);

$my_sex = mysql_result($result,0,3);

$my_milage = mysql_result($result,0,4);

$my_level = mysql_result($result,0,5);

?>

  

 

<table width="402" border="0" cellspacing="1" cellpadding="0" align="center">

<tr>

   <td bgColor="#8080FF">

  

  <table width="400" border="0" cellspacing="1" cellpadding="5" align="center">

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED">

      <font size=2>이 름</font></td>

      <td width="280" bgColor="#FAFAEE"><?echo("$my_name")?></td>

   </tr>

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED">

      <font size=2>아이디</font></td>

      <td width="280" bgColor="#FAFAEE"><?echo("$my_id")?></td>

   </tr>

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED">

      <font size=2>이메일주소</font></td>

      <td width="280" bgColor="#FAFAEE"><?echo("$my_email")?></td>

   </tr>       

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED">

      <font size=2>성별</font></td>

      <td width="280" bgColor="#FAFAEE">

<?       

if(!strcmp($my_sex,"M")) {

   echo("남자");

} else {

   echo("여자");       

}       

?>       

      </td>

   </tr>    

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED">

      <font size=2>마일리지</font></td>

      <td width="280" bgColor="#FAFAEE"><?echo("$my_milage")?></td>

   </tr>    

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED">

      <font size=2>사용자등급</font></td>

      <td width="280" bgColor="#FAFAEE">

<?       

if(!strcmp($my_level,"A")) {

   echo("User Level A");

} else if(!strcmp($my_level,"B")) {

   echo("User Level B");

} else {

   echo("User Level C");

}          

?>       

      </td>

   </tr>    

      <tr>

      <td align="center" colspan="2" bgColor="white">

      <font size=2>

                <a href="list.html">목록</a> |

                <a href="modifyform.html?id=<?echo($id);?>">수정</a> |

                <a href="deleteform.html?id=<?echo($id);?>">삭제</a>

          </font>

      </td>

   </tr>

 

   </table>

  

   </td>

</tr>

</table>

  

</body>

</html>

 

3. 목록(list.html) - 페이지 분할 기능 추가

바뀐화면은 아래와 같습니다.

<?

########### 한 페이지당 출력할 게시물의 수

$num_per_page = 10;

 

########### 게시물 출력목록 하단에 링크를 걸 페이지의 개수

$page_per_block = 10;

 

########### 페이지 초기화

if(!$page) {

                $page = 1;

}

 

?>

<html>

<head>

   <style type="text/css">

   <!--

   a:link,a:visited,a:active {

      text-decoration : none;

      font-size : 10pt;

   }

   a:hover {

      text-decoration : underline;

      color : red;

      font-size : 10pt;

   }

   BODY, TR, TD, TH {

      font-size : 10pt;

   }

   //-->

   </style>

</head>

<body>

  

<?

########## 데이터베이스 서버에 연결한다. ##########

$dbconn = mysql_connect("localhost","php","php99")

or die("DB서버 연결에 실패하였습니다!");

  

########## 작업 데이터베이스로 sample을 선택한다. ##########

$status = mysql_select_db("sample",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

    

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

### SELECT 쿼리문으로 userdb테이블에 저장되어 있는

### 모든 사용자 데이터를 불러온다.

 

$query = "SELECT name,id,email,sex,milage,level FROM userdb ORDER BY id";

$result = mysql_query($query,$dbconn);

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

       

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

$total_record = mysql_num_rows($result);

 

########## 현재의 페이지에서 출력할 게시물의 범위를 결정한다. ##########

if(!$total_record) {

   $first = 1;

   $last = 0;   

} else {

   $first = $num_per_page*($page-1);

   $last = $num_per_page*$page;

 

   $IsNext = $total_record - $last;

   if($IsNext > 0) {

      $last -= 1;

   } else {

      $last = $total_record - 1;

   }      

}

 

########## 전체 페이지수를 계산한다. ##########

$total_page = ceil($total_record/$num_per_page);

?>

  

<table width=400 border=0 cellpadding=3 align=center>

<tr>

<?

if(!$total_record) {

   echo("<td colspan=8 align=center>현재 등록되어 있는 사용자가 없습니다.</td>");

} else {

?>

   <td colspan=8 align=center>전체 회원수 <b><?echo("$total_record")?></b>명

   &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;

   <font size=2>( <font color="red"><? echo("$page") ?></font> /

   <font color="red"><? echo("$total_page") ?></font> )</font></td>

<?

}

?>

</tr>

<tr>

   <td bgColor=pink align="center" width=30>번호</td>

   <th bgColor=pink align=center>이름</td>

   <th bgColor=pink align=center>아이디</td>

   <th bgColor=pink align=center>성별</td>

</tr>    

  

<?

 

########## 게시물의 가상번호(게시물의 개수에 따른 일련번호) ##########

$article_num = $total_record - $num_per_page*($page-1);

 

########## 테이블내 모든 레코드의 각 데이터 값을 각각의 변수에 저장하여 출력한다.

for($i = $first; $i <= $last; $i++) {

   $my_name = mysql_result($result,$i,0);

   $my_id = mysql_result($result,$i,1);

   $my_email = mysql_result($result,$i,2);

   $my_sex = mysql_result($result,$i,3);

    

   echo("

      <tr>

         <td bgColor=lightyellow align=center>$article_num</td>

         <td bgColor=lightyellow align=center>

         <a href=\"viewuser.html?id=$my_id\">$my_name</a></td>

         <td bgColor=lightyellow align=center>

         <a href=\"mailto:$my_email\">$my_id</a></td>

         <td bgColor=lightyellow align=center>$my_sex</td>

     </tr>

   ");

 

   $article_num--;

}

?>

  

</table>

<table width="400" border="0" cellspacing="0" cellpadding="0" align="center">

<tr>

   <td colspan="6" align="center">

<?

### 게시물 목록 하단의 각 페이지로 직접 이동할 수 있는

### 페이지링크에 대한 설정을 한다.

 

$total_block = ceil($total_page/$page_per_block);

$block = ceil($page/$page_per_block);

 

$first_page = ($block-1)*$page_per_block;

$last_page = $block*$page_per_block;

 

if($total_block <= $block) {

   $last_page = $total_page;

}

 

########## 이전페이지블록에 대한 페이지 링크 ##########

if($block > 1) {

   $my_page = $first_page;

   echo("<font size=2><a href=\"$php_self?page=$my_page\" >

   [이전 ${page_per_block}개]</a></font>");

}

 

### 현재의 페이지 블럭범위내에서 각 페이지로 바로

### 이동할 수 있는 하이퍼링크를 출력한다.

for($direct_page = $first_page+1; $direct_page <= $last_page; $direct_page++) {

   if($page == $direct_page) {

      echo("<font size=2><b>[$direct_page]</b></font>");

   } else {

      echo("<font size=2><a href=\"list.html?page=$direct_page\">

      [$direct_page]</a></font>");

   }

}

 

########## 다음페이지블록에 대한 페이지 링크 ##########

if($block < $total_block) {

   $my_page = $last_page+1;

   echo("<font size=2><a href=\"list.html?page=$my_page\">

   [다음 ${page_per_block}개]</a></font>");

}

?>   

   </td>

</tr>

</table>

 

<table width="400" border="0" cellspacing="0" cellpadding="0" align="center">

<tr>

   <td align="left">

   <a href="list.html">목록</a>

   </td>

   <td align="right">

   <a href="adduserform.html">등록</a> |

<?

########## 이전페이지가 존재할 경우 이전페이지로 가는 링크를 활성화시킨다.

if ($page > 1) {

   $page_num = $page - 1;

   echo("<a href=\"list.html?page=$page_num\">이전</a> | ");

} else {

   echo("이전 | ");

}

 

### 게시물이 다음페이지에도 존재할 경우 다음페이지로 가는

### 링크를 활성화시킨다.

if ($IsNext > 0) {

   $page_num = $page + 1;   

   echo("<a href=\"list.html?page=$page_num\">다음</a></td>");

} else {

   echo("다음</td>");

}

?>

 

</tr>

</table>

  

</body>

</html>

  

<?

########## 데이터베이스 연결을 해제한다. ##########

mysql_close($dbconn);

?>

 가. 페이지 분할 기능

페이지 분할 기능이란 한 페이지에 출력할 수 있는 회원수, 즉 레코드의 수를 미리 정하여 전체 방문 기록의 개수가 이 값보다 클 경우 여러 페이지에 나누어서 출력하는 기능을 말한다. 예를 들어, 회원관리 테이블에서 저장되어 있는 레코드가 총 24개인데 변수 $num_per_page 즉, 한페이지 당 출력 레코드의 개수를 10으로 설정하면 24/10=2.4이므로 24개의 레코드는 모두 3페이지 걸쳐 출력된다. 즉, 1페이지에는 결과 레코드셋트에서 처음 10개의 레코드가, 2페이지에는 그다음 10개의 레코드가, 마지막 3페이지에는 나머지 4개의 레코드가 출력된다.

이러한 기능을 구현하기 위해서는 먼저 회원테이블에 저장되어 있는 전체 레코드 수를 계산하여 이값을 $num_per_page로 나누어 총 몇 페이지로 출력해야 하는지를 계산해야 한다. 위의 예에서는 총 24개의 레코드에 $num_per_page가 10이므로 24/10=2.4가 된다. 따라서 전체 레코드 개수를 $num_per_page로 나눈값이 부동소수점일 경우 이값보다 큰 정수중 최소값이 전체 페이지 개수가 되는 것이다.

이계산을 위해서 ceil()함수를 사용하면된다. ceil()함수는 그 계산 결과가 부동소수점일 경우 그 값보다 큰 정수중 최소값을 반환하는 올림 함수이므로 ceil(전체 레코드 개수/페이지 당 출력 개수)는 전체 회원의 페이지 개수가 되는 것이다.

$total_page = ceil($total_record/$num_per_page);

이렇게 나누어 출력할 페이지의 총수가 정해지면, 다음으로는 각 페이지에서 출력해야 하는 레코드의 범위를 결정해야 한다. 위의 예에서 1페이지에서는 $num_per_page가 10이므로 결과 레코드의 범위를 결정해야 한다. 그리고 2페이지에서는 11번째 레코드인 레코드 번호10번부터 20번째 레코드인 레코드인 레코드 번호 20부터 마지막 24번째 레코드인 레코드 번호 23까지의 레코드가 출력되어야 한다.

각 페이지에서 출력할 레코드의 범위를 결정한다는 것은 이렇게 각 페이지에서 처음으로 출력되는 레코드 번호와 마지막으로 출력되는 레코드의 번호를 계산하여 변수에 저장한다는 것이다. 이 때 각 페이지에서 처음 출력하는 레코드 번호는 변수 $first에, 마지막으로 출력하는 레코드 번호는 $last에 저장한다. 따라서, 1페이지에서는 $first는 0, $last는 9가 되고, 2페이지에서는 $first는 10, $last는 19가 된다. 그리고, 마지막 3페이지에서는 $first는 20이되고 $last는 23이된다.

그럼 출력하고자하는 페이지 수($page)와 그 페이지에서의 $first, $last와의 관계식은 어떻게 만들 수 있을까?

이는 똑같은 출력 결과라 할 지라도 어떤 계산 방식을 사용하느냐에 따라 여러 가지 방법이 있을 수 있다.

$first = $num_per_page * ($page - 1);

$last = $num_per_page * $page;

우선 이렇게 하면, 각 페이지에서의 $first와 $last는 다음과 같은 값을 갖게 된다.

 

페이지 번호

$first

$last

1

0

10

2

10

20

3

20

30

레코드의 번호는 MySQL 함수에서 배열 형태로 레코드를 가져온다. 배열의 첨자는 0부터 시작한다. 즉, 0번 레코드가 결과 레코드 세트에서 첫 번째로 나타나는 레코드인 것이다. 따라서 1페이지에서 $first는 0이 되고 2페이지에서는 11번째 레코드부터 출력되므로 레코드 번호는 10이된다. 마찬가지로 3페이지에서는 21번째 레코드, 즉 20번 레코드가 $first가 된다. 따라서 $first는 계산식을 수정할 필요가 없다.

그러나 $last의 경우에는 위와 같은 식으로 계산하게 되면 다음페이지의 $first와 레코드 번호가 중복되고, 또 각 페이지에는 11개씩의 레코드가 출력되어 버린다. 따라서, $num_per_page에서 지정한 대로 페이지당 10개씩 출력하기 위해서는 각페이지의 $last는 1을 뺀 값으로 재 설정한다.

$last = $last - 1;

단, 이때 1~2페이지와 같이 현재 페이지가 마지막 페이지가 아니고, 다음에 계속 출력해야 할 페이지가 있다면 현재의 $last에서 1을 뺀값을 다시 $last에 설정하면 된다. 그러나 3페이지와 같이 현재의 페이지가 마지막 페이지이면, 30-1=29번 레코드이므로, 존재하지 않는 레코드를 가리키게 된다. 이 때에는 앞에서 구한 전체 레코드 개수에서 1을 뺀 값 즉, 24-1=23번 레코드가 마지막 페이지의 $last가 되어야한다.

if($total_page == $page) {

      $last = $total_record - 1;

}

 

이렇게 계산하면 각 페이지에서의 $first와 $last의 값은 각각 다음과 같이 수정된다.

페이지 번호

$first

$last

1

0

10 -> 9(10-1)

2

10

20 -> 19(20-1)

3

20

30 -> 23(24-1)

 

 

나. 페이지 이동기능

페이지 이동기능은 위의 그림에서 "[1][2][3]" 와 같은 하이퍼 링크로 이 링크를 클릭하면 해당 페이지를 출력하는 기능이다. 즉, 다음 페이지나 이전 페이지를 통해 한 페이지씩 이동하지 않고, 페이지 번호를 클릭하여 바로 해당 페이지로 이동할 수 있는 기능을 말한다. 예를 들어, [2]를 클릭하면, 실제 실행 되는 파일은 "list.html?page=2"와 같이 되며 URL을 통해 전달된 출력할 페이지 번호($page)로부터 해당 회원 테이블에서 특정 페이지를 출력하게 되는 것이다.

페이지 직접 이동 기능은 앞에서 설명한 페이지 분할 기능보다 조금더 생각해야 한다. 하지만 기본적인 구현 원리는 비슷하다고 할 수 있다.

페이지 분할 기능이 $num_per_page의 값에 따라 다르게 출력되듯이 페이지 직접이동 기능은 $page_per_block이라는 변수의 값에 따라 출력 결과가 달라진다.

예를 들면, 이값이 5이면, 한 페이지에 출력되는  직접 이동 링크는 최대 5개가 되고, 이값이 10이면 최대 10개 까지의 페이지 링크가 출력된다. 앞에서 $num_per_page가 10이라고 설정하면 한페이지에 10개의 레코드가 출력되었다. 이는 즉, 10개의 레코드 묶음을 하나의 페이지로 표현한 것이다.  비슷한 개념으로 10개의 페이지를 하나의 페이지 블록으로 표현할 수가 있다. 쉽게 생각하면, 하나의 페이지 묶음이라고 할 수 있다.

앞에서 페이지 분할 기능을 구현하기 위해 현재의 페이지에서 출력할 레코드의 시작번호와 마지막 번호를 계산했듯이 여기서는 현재의 블록에서 링크 형태서 출력할 페이지의 시작 번호와 마지막 번호를 계산한다. 그리고 그 시작 페이지 번호와 마지막 페이지 번호로 for 루프를 돌려 이 범위내에 들어가는 페이지 들에 대해서는 해당 페이지로 바로 이동할 수 있는 링크를 출력한다.

이를 위해 우선 전체의 페이지 블록의 수를 계산한다. 전체 페이지 블록은 페이지 분할의 경우와 동일한 방식으로 계산된다. 즉, 전체 페이지의 개수를 $page_per_block으로 나누어 부동소수점일 경우 해당 결과값보다 큰정수 중 최소값을  전체 페이지 블록의 개수로 계산한다. 앞에서 설명한 것과 같이 ceil()함수를 사용하면 된다. 즉, ceil(현재 페이지번호/블록당 페이지수) 함수의 결과값이 현재의 페이지 블록 $block이 된다.

$total_block = ceil($total_page/$page_per_block);

$block = ceil($page/$page_per_block);

다음으로는 현재의 블록에서 출력할 직접 이동 링크의 첫 번째 페이지 번호와 마지막 페이지 번호를 계산한다. 페이지 분할의 경우와 같은 원리로 다음과 같이 계산되며 첫 번째 페이지는 변수 $first_page에 마지막 페이지는 $last_page에 각각 저장한다.

$first_page = ($block-1)*$page_per_block;

$last_page = $block*$page_per_block;

 

 

 

예를 들어, 레코드가 240개 있고 $num_per_page가 10이라고 했을 때 $page_per_block역시 10이라면 각 block에서의 $first_page와  $last_page는 다음과 같은 값을 갖는다.

블록 번호($block)

$first_page

$last_page

1

0

10

2

10

20

3

20

30

이번에는 페이지 분할 기능과 조금 달리 생각해야 한다.

페이지 분할 기능에서는 mysql_result()함수로 한줄의 레코드를 가져올 때 레코드 번호가 0부터 시작하므로 $last변수의 값을 재설정하였지만 여기서는 해당 페이지로 직접 이동할 수 있는 페이지 링크를 출력하는 것이므로 0이 아닌 1페이지에서부터 출력이 시작된다. 따라서 이번에는 $first_page부분의 변수값을 재설정해 주어야 한다.

$first_page = $first_page+1;

즉, for 루프문으로 $first_page와 $last_page사이의 페이지 링크를 출력할 때에는 $first_page에 1을 더한 페이지에서부터 출력을 시작한다. 따라서 위의 예에서 첫 번째 블록에서 $first_page는 1이고, $last_page는 그대로 10이 된다. 두 번째 블록에서는 $first_page는 11이 되고, $last_page는 20이 된다. 그리고 마지막 세 번째 블록에서는 $first_page가 21이 되고, $last_page는 현재 블록이 마지막 블록이므로 마지막 페이지인 $total_page가 된다.

if($total_block <= $block) {

   $last_page = $total_page;

}

 

블록 번호($block)

$first_page

$last_page

1

0 -> 1(0+1)

10

2

10 -> 11(10+1)

20

3

20 -> 21(20+1)

30 -> 24

페이지 분할 기능에서 현재 페이지의 이전이나 다음에 나타나는 레코드는 이전/다음 페이지 이동 기능을 통해 출력하듯이 페이지 직접 이동 기능에서 다음 페이지 블록에 포함되는 페이지들에 대한 이동 링크를 출력하기 위해서는 [다음$page_per_block 개]와 같은 링크를 통해 이동해야 한다.

앞에서의 예와 같이 총 24페이지 일 경우 첫 번째 페이지 블록에는 1페이지에서 10 페이지까지가 포함된다. 그리고 이범위 내의 페이지를 "list.html?page=페이지번호"와 같은 출력 파일을 실행하여 출력하면 회원관리의 하단에는 이 페이지블록에 속해 있는 모든 페이지들에 대한 이동링크가 출력된다.

[1][2][3][4][5][6][7][8][9][10]

와 같이 현재 출력된 페이지가 속해 있는 페이지 블록 내의 페이지에 대한 이동 링크들이 출력된다.

만약 현재 페이지의 페이지블록이 2라면 두 번째 페이지 블록에 속해 있는 페이지들 즈, 11에서 20페이지 까지를 출력하면

[11][12][13][14][15][16][17][18][19][20]

과 같이 출력된다.

현재의 페이지블록이 마지막 페이지블록이라면, $first_page와 $last_page는 각각 21,24이므로 하단에

[21][22][23][24]

가 출력된다.

만약에 현재의 페이지 블록이 1보다 크면 이전 페이지 블록(최소한 1페이지블록)으로 이동할 수 있는 여유가 있으므로 이전 페이지 블록의 $last_page에 대한 페이지 링크를 [이전 $page_per_block 개]라는 이름으로 출력한다. 그럼 이링크를 클릭하면, 이전 페이지 블록에 속하는 페이지들에 대한 이동 링크가 하단에 출력된다. 즉 현재 페이지 블록이 2라면 다음과 간이 2페이지 블록에 속하는 페이지들에 대한 링크와 함께 [이전 10개]라는 링크가 왼쪽에 출력된다.

[이전10개] [11][12][13][14][15][16][17][18][19][20] [다음10개]

이 [이전10개]링크는 현재의 블록이 2라고 했을 때 2보다 1이 적은 블록, 즉 1블록의 $last_page값인 10페이지로 가는  링크가 된다. 따라서 이 링크를 클릭하면 "list.html?page=10"파일이 실행되어 10페이지가 출력되면서 하단에는 10페이지가 속한 1블록의 페이지링크가 다음과 같이 출력된다.

[1][2][3][4][5][6][7][8][9][10] [다음10개]

또한 만일 현재의 페이지블록이 전체 페이지블록 수보다 작다면 다음 블록으로 이동할 수 있는 여유가 있으므로 다음 페이지 블록의 $first_page, 즉 현재 블록의 $last_page에 1을 더한 페이지로 가는 링크를 [다음 $page_per_block 개]라는 이름으로 출력한다.

위에서 [다음10개]링크는 현재 block이 1이고, 1블록에 대한 $last_page가 10이므로 $last_page에 1을 더한 11페이지로 가는 링크가 된다. 따라서 이 링크를 클릭하면, "list.html?page=11"파일이 실행되며, 11페이지는 2페이지 블록에 속하므로 출력결과 하단에는 2페이지 블록에 속하는 페이지들에 대한 이동 링크가 출력된다.

 

다. 이전페이지, 다음페이지 이동 기능

현재의 페이지가 1페이지보다 크면, 이전 페이지로 이동할 수 있는 여유가 있으므로 현재의 페이지보다 1이 작은 페이지로 이동하는 링크를 출력한다. 만일, 현재의 페이지가 1페이지이면 더 이상 이전 페이지가 없으므로 그냥 아이콘 이미지만 출력한다.

 

만일 현재의 페이지가 마지막 페이지보다 작다면 다음 페이지로 이동할 수 있는 여유가 있으므로 현재의 페이지 보다 1이 큰 페이지로 이동하는 링크를 출력한다. 그러나 현재의 페이지가 마지막 페이지라면 더 이상 다음 페이지가 존재하지 않으므로 링크없이 아이콘 이미지만 출력한다.

 

 

4. 목록(list.html) - 정렬기능

한글 정렬기능을 위해서는 아래와 같이 데몬을 실행해야 한다.

 C:\mysql\bin\mysqld.exe --default-character-set=euc_kr

 

윈도우용 MySQL 환경설정파일(c:\windows\my.ini)에 아래부분을 추가한다.

... 생략

default-character-set=euc_kr

 환경설정파일에 위와 같이 추가 하였다면,

C:\mysql\bin\mysqld.exe 와 같이 실행하여도 한글 정렬이 가능하다.

 

 

<?

########### 한 페이지당 출력할 게시물의 수

$num_per_page = 10;

 

########### 게시물 출력목록 하단에 링크를 걸 페이지의 개수

$page_per_block = 10;

 

########### 페이지 초기화

if(!$page) {

                $page = 1;

}

 

?>

<html>

<head>

   <style type="text/css">

   <!--

   a:link,a:visited,a:active {

      text-decoration : none;

      font-size : 10pt;

   }

   a:hover {

      text-decoration : underline;

      color : red;

      font-size : 10pt;

   }

   BODY, TR, TD, TH {

      font-size : 10pt;

   }

   //-->

   </style>

</head>

<body>

  

<?

########## 데이터베이스 서버에 연결한다. ##########

$dbconn = mysql_connect("localhost","php","php99") or die("DB서버 연결에 실패하였습니다!");

  

########## 작업 데이터베이스로 sample을 선택한다. ##########

$status = mysql_select_db("sample",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

    

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

########## SELECT 쿼리문으로 userdb테이블에 저장되어 있는 모든 사용자 데이터를 불러온다. ##########

if(!strcmp($order,"name"))

        $query = "SELECT name,id,email,sex,milage,level FROM userdb ORDER BY name";

else if(!strcmp($order,"id"))

        $query = "SELECT name,id,email,sex,milage,level FROM userdb ORDER BY id";

else

        $query = "SELECT name,id,email,sex,milage,level FROM userdb";

 

$result = mysql_query($query,$dbconn);

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

       

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

$total_record = mysql_num_rows($result);

 

########## 현재의 페이지에서 출력할 게시물의 범위를 결정한다. ##########

if(!$total_record) {

   $first = 1;

   $last = 0;   

} else {

   $first = $num_per_page*($page-1);

   $last = $num_per_page*$page;

 

   $IsNext = $total_record - $last;

   if($IsNext > 0) {

      $last -= 1;

   } else {

      $last = $total_record - 1;

   }      

}

 

########## 전체 페이지수를 계산한다. ##########

$total_page = ceil($total_record/$num_per_page);

?>

  

<table width=400 border=0 cellpadding=3 align=center>

<tr>

<?

if(!$total_record) {

   echo("<td colspan=8 align=center>현재 등록되어 있는 사용자가 없습니다.</td>");

} else {

?>

   <td colspan=8 align=center>전체 회원수 <b><?echo("$total_record")?></b>명

   &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;

   <font size=2>( <font color="red"><? echo("$page") ?></font> /

   <font color="red"><? echo("$total_page") ?></font> )</font></td>

<?

}

?>

</tr>

<tr>

   <td bgColor=pink align="center" width=30>번호</td>

   <th bgColor=pink align=center><a href="list.html?order=name">이름</a></td>

   <th bgColor=pink align=center><a href="list.html?order=id">아이디</a></td>

   <th bgColor=pink align=center>성별</td>

</tr>    

  

<?

$time_limit = 60*60*24*$notify_new_article;

 

########## 게시물의 가상번호(게시물의 개수에 따른 일련번호) ##########

$article_num = $total_record - $num_per_page*($page-1);

 

########## 테이블내 모든 레코드의 각 데이터 값을 각각의 변수에 저장하여 출력한다. ##########

for($i = $first; $i <= $last; $i++) {

   $my_name = mysql_result($result,$i,0);

   $my_id = mysql_result($result,$i,1);

   $my_email = mysql_result($result,$i,2);

   $my_sex = mysql_result($result,$i,3);

    

   echo("

      <tr>

         <td bgColor=lightyellow align=center>$article_num</td>

         <td bgColor=lightyellow align=center><a href=\"viewuser.html?id=$my_id\">$my_name</a></td>

         <td bgColor=lightyellow align=center><a href=\"mailto:$my_email\">$my_id</a></td>

         <td bgColor=lightyellow align=center>$my_sex</td>

     </tr>

   ");

 

   $article_num--;

}

?>

  

</table>

<table width="400" border="0" cellspacing="0" cellpadding="0" align="center">

<tr>

   <td colspan="6" align="center">

<?

########## 게시물 목록 하단의 각 페이지로 직접 이동할 수 있는 페이지링크에 대한 설정을 한다. $total_block = ceil($total_page/$page_per_block);

$block = ceil($page/$page_per_block);

 

$first_page = ($block-1)*$page_per_block;

$last_page = $block*$page_per_block;

 

if($total_block <= $block) {

   $last_page = $total_page;

}

 

########## 이전페이지블록에 대한 페이지 링크 ##########

if($block > 1) {

   $my_page = $first_page;

   echo("<font size=2><a href=\"$php_self?page=$my_page\" >[이전 ${page_per_block}개]</a></font>");

}

 

########## 현재의 페이지 블럭범위내에서 각 페이지로 바로 이동할 수 있는 하이퍼링크를 출력한다.

for($direct_page = $first_page+1; $direct_page <= $last_page; $direct_page++) {

   if($page == $direct_page) {

      echo("<font size=2><b>[$direct_page]</b></font>");

   } else {

      echo("<font size=2><a href=\"list.html?page=$direct_page\">[$direct_page]</a></font>");

   }

}

 

########## 다음페이지블록에 대한 페이지 링크 ##########

if($block < $total_block) {

   $my_page = $last_page+1;

   echo("<font size=2><a href=\"list.html?page=$my_page\">[다음 ${page_per_block}개]</a></font>");

}

?>   

   </td>

</tr>

</table>

 

<table width="400" border="0" cellspacing="0" cellpadding="0" align="center">

<tr>

   <td align="left">

   <a href="list.html">목록</a>

   </td>

   <td align="right">

   <a href="adduserform.html">등록</a> |

<?

########## 이전페이지가 존재할 경우 이전페이지로 가는 링크를 활성화시킨다.

if ($page > 1) {

   $page_num = $page - 1;

   echo("<a href=\"list.html?page=$page_num\">이전</a> | ");

} else {

   echo("이전 | ");

}

 

########## 게시물이 다음페이지에도 존재할 경우 다음페이지로 가는 링크를 활성화시킨다.

if ($IsNext > 0) {

   $page_num = $page + 1;   

   echo("<a href=\"list.html?page=$page_num\">다음</a></td>");

} else {

   echo("다음</td>");

}

?>

 

</tr>

</table>

  

</body>

</html>

  

<?

########## 데이터베이스 연결을 해제한다. ##########

mysql_close($dbconn);

?>

 

 

5. 목록(list.html) - 검색기능

 

 

 

 <?

########### 한 페이지당 출력할 게시물의 수

$num_per_page = 10;

 

########### 게시물 출력목록 하단에 링크를 걸 페이지의 개수

$page_per_block = 10;

 

########### 페이지 초기화

if(!$page) {

                $page = 1;

}

 

?>

<html>

<head>

   <style type="text/css">

   <!--

   a:link,a:visited,a:active {

      text-decoration : none;

      font-size : 10pt;

   }

   a:hover {

      text-decoration : underline;

      color : red;

      font-size : 10pt;

   }

   BODY, TR, TD, TH {

      font-size : 10pt;

   }

   //-->

   </style>

</head>

<body>

  

<?

########## 데이터베이스 서버에 연결한다. ##########

$dbconn = mysql_connect("localhost","php","php99") or die("DB서버 연결에 실패하였습니다!");

  

########## 작업 데이터베이스로 sample을 선택한다. ##########

$status = mysql_select_db("sample",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

    

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

$encoded_key = urlencode($key);

 

if($key != "") {

        if(!strcmp($order,"name"))

                $query = "SELECT name,id,email,sex,milage,level FROM userdb  WHERE $keyfield LIKE '%$key%' ORDER BY name";

        else if(!strcmp($order,"id"))

                $query = "SELECT name,id,email,sex,milage,level FROM userdb  WHERE $keyfield LIKE '%$key%' ORDER BY id";

        else

                $query = "SELECT name,id,email,sex,milage,level FROM userdb  WHERE $keyfield LIKE '%$key%'";

 

}else {

 

########## SELECT 쿼리문으로 userdb테이블에 저장되어 있는 모든 사용자 데이터를 불러온다. ##########

        if(!strcmp($order,"name"))

                $query = "SELECT name,id,email,sex,milage,level FROM userdb ORDER BY name";

        else if(!strcmp($order,"id"))

                $query = "SELECT name,id,email,sex,milage,level FROM userdb ORDER BY id";

        else

                $query = "SELECT name,id,email,sex,milage,level FROM userdb";

}

$result = mysql_query($query,$dbconn);

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

       

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

$total_record = mysql_num_rows($result);

 

########## 현재의 페이지에서 출력할 게시물의 범위를 결정한다. ##########

if(!$total_record) {

   $first = 1;

   $last = 0;   

} else {

   $first = $num_per_page*($page-1);

   $last = $num_per_page*$page;

 

   $IsNext = $total_record - $last;

   if($IsNext > 0) {

      $last -= 1;

   } else {

      $last = $total_record - 1;

   }      

}

 

########## 전체 페이지수를 계산한다. ##########

$total_page = ceil($total_record/$num_per_page);

?>

  

<table width=400 border=0 cellpadding=3 align=center>

<tr>

<?

if(!$total_record) {

   echo("<td colspan=8 align=center>현재 등록되어 있는 사용자가 없습니다.</td>");

} else {

?>

   <td colspan=8 align=center>전체 회원수 <b><?echo("$total_record")?></b>명

   &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;

   <font size=2>( <font color="red"><? echo("$page") ?></font> /

   <font color="red"><? echo("$total_page") ?></font> )</font></td>

<?

}

?>

</tr>

<tr>

   <td bgColor=pink align="center" width=30>번호</td>

   <th bgColor=pink align=center><a href="list.html?order=name<?echo("&keyfield=$keyfield&key=$encoded_key");?>">이름</a></td>

   <th bgColor=pink align=center><a href="list.html?order=id<?echo("&keyfield=$keyfield&key=$encoded_key");?>">아이디</a></td>

   <th bgColor=pink align=center>성별</td>

</tr>    

  

<?

$time_limit = 60*60*24*$notify_new_article;

 

########## 게시물의 가상번호(게시물의 개수에 따른 일련번호) ##########

$article_num = $total_record - $num_per_page*($page-1);

 

########## 테이블내 모든 레코드의 각 데이터 값을 각각의 변수에 저장하여 출력한다. ##########

for($i = $first; $i <= $last; $i++) {

   $my_name = mysql_result($result,$i,0);

   $my_id = mysql_result($result,$i,1);

   $my_email = mysql_result($result,$i,2);

   $my_sex = mysql_result($result,$i,3);

    

   echo("

      <tr>

         <td bgColor=lightyellow align=center>$article_num</td>

         <td bgColor=lightyellow align=center><a href=\"viewuser.html?id=$my_id&keyfield=$keyfield&key=$encoded_key\">$my_name</a></td>

         <td bgColor=lightyellow align=center><a href=\"mailto:$my_email\">$my_id</a></td>

         <td bgColor=lightyellow align=center>$my_sex</td>

     </tr>

   ");

 

   $article_num--;

}

?>

  

</table>

<table width="400" border="0" cellspacing="0" cellpadding="0" align="center">

<tr>

   <td colspan="6" align="center">

<?

########## 게시물 목록 하단의 각 페이지로 직접 이동할 수 있는 페이지링크에 대한 설정을 한다. $total_block = ceil($total_page/$page_per_block);

$block = ceil($page/$page_per_block);

 

$first_page = ($block-1)*$page_per_block;

$last_page = $block*$page_per_block;

 

if($total_block <= $block) {

   $last_page = $total_page;

}

 

########## 이전페이지블록에 대한 페이지 링크 ##########

if($block > 1) {

   $my_page = $first_page;

   echo("<font size=2><a href=\"$php_self?page=$my_page&keyfield=$keyfield&key=$encoded_key\" >[이전 ${page_per_block}개]</a></font>");

}

 

########## 현재의 페이지 블럭범위내에서 각 페이지로 바로 이동할 수 있는 하이퍼링크를 출력한다.

for($direct_page = $first_page+1; $direct_page <= $last_page; $direct_page++) {

   if($page == $direct_page) {

      echo("<font size=2><b>[$direct_page]</b></font>");

   } else {

      echo("<font size=2><a href=\"list.html?page=$direct_page&keyfield=$keyfield&key=$encoded_key\">[$direct_page]</a></font>");

   }

}

 

########## 다음페이지블록에 대한 페이지 링크 ##########

if($block < $total_block) {

   $my_page = $last_page+1;

   echo("<font size=2><a href=\"list.html?page=$my_page&keyfield=$keyfield&key=$encoded_key\">[다음 ${page_per_block}개]</a></font>");

}

?>   

   </td>

</tr>

</table>

 

<table width="400" border="0" cellspacing="0" cellpadding="0" align="center">

<tr>

   <td align="left">

   <a href="list.html">목록</a>

   </td>

   <td align="right">

   <a href="adduserform.html">등록</a> |

<?

########## 이전페이지가 존재할 경우 이전페이지로 가는 링크를 활성화시킨다.

if ($page > 1) {

   $page_num = $page - 1;

   echo("<a href=\"list.html?page=$page_num&keyfield=$keyfield&key=$encoded_key\">이전</a> | ");

} else {

   echo("이전 | ");

}

 

########## 게시물이 다음페이지에도 존재할 경우 다음페이지로 가는 링크를 활성화시킨다.

if ($IsNext > 0) {

   $page_num = $page + 1;   

   echo("<a href=\"list.html?page=$page_num&keyfield=$keyfield&key=$encoded_key\">다음</a></td>");

} else {

   echo("다음</td>");

}

?>

 

</tr>

</table>

  

<center>

<form method="post" action="./list.html">

<font size=-1>

<select name="keyfield" size="1">

   <option value="name">이름</option>

   <option value="id">내용</option>

</select>

</font>

<input type="text" size="20" maxlength="30" name="key">

<font size=2><input type="submit" value="검색"></font>

</form>

</center>

</body>

</html>

  

<?

########## 데이터베이스 연결을 해제한다. ##########

mysql_close($dbconn);

?>

 

 

6. 세부사항보기(viewuser.html) - 검색기능

검색기능 추가에 따른 세부사항보기도 수정이 필요하다. 다시 목록으로 돌아가면, 검색기능에 포함된 기능은 없어진다.

 

<html>

<head>

   <style type="text/css">

   <!--

   a:link,a:visited,a:active {

      text-decoration : none;

      font-size : 10pt;

   }

   a:hover {

      text-decoration : underline;

      color : red;

      font-size : 10pt;

   }

   BODY, TR, TD, TH {

      font-size : 10pt;

   }

   //-->

   </style>

</head>

<body>

  

<?

########## 데이터베이스 서버에 연결한다. ##########

$dbconn = mysql_connect("localhost","php","php99") or die("DB서버 연결에 실패하였습니다!");

  

########## 작업 데이터베이스로 sample을 선택한다. ##########

$status = mysql_select_db("sample",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

    

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

########## 수정하고자 하는 사용자의 정보를 뽑아온다. ##########

$query = "SELECT name,id,email,sex,milage,level FROM userdb WHERE id = '$id'";

$result = mysql_query($query,$dbconn);

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

       

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

  

$my_name = mysql_result($result,0,0);

$my_id = mysql_result($result,0,1);

$my_email = mysql_result($result,0,2);

$my_sex = mysql_result($result,0,3);

$my_milage = mysql_result($result,0,4);

$my_level = mysql_result($result,0,5);

?>

  

 

<table width="402" border="0" cellspacing="1" cellpadding="0" align="center">

<tr>

   <td bgColor="#8080FF">

  

  <table width="400" border="0" cellspacing="1" cellpadding="5" align="center">

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED"><font size=2>이 름</font></td>

      <td width="280" bgColor="#FAFAEE"><?echo("$my_name")?></td>

   </tr>

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED"><font size=2>아이디</font></td>

      <td width="280" bgColor="#FAFAEE"><?echo("$my_id")?></td>

   </tr>

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED"><font size=2>이메일주소</font></td>

      <td width="280" bgColor="#FAFAEE"><?echo("$my_email")?></td>

   </tr>       

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED"><font size=2>성별</font></td>

      <td width="280" bgColor="#FAFAEE">

<?       

if(!strcmp($my_sex,"M")) {

   echo("남자");

} else {

   echo("여자");       

}       

?>       

      </td>

   </tr>    

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED"><font size=2>마일리지</font></td>

      <td width="280" bgColor="#FAFAEE"><?echo("$my_milage")?></td>

   </tr>    

   <tr>

      <td width="220" align="center" bgColor="#CFD0ED"><font size=2>사용자등급</font></td>

      <td width="280" bgColor="#FAFAEE">

<?       

if(!strcmp($my_level,"A")) {

   echo("User Level A");

} else if(!strcmp($my_level,"B")) {

   echo("User Level B");

} else {

   echo("User Level C");

}          

?>       

      </td>

   </tr>    

      <tr>

      <td align="center" colspan="2" bgColor="white">

      <font size=2>

                <a href="list.html?<?echo("order=$order&keyfield=$keyfield&key=$key");?>">목록</a> |

                <a href="modifyform.html?<?echo("id=$id&order=$order&keyfield=$keyfield&key=$key");?>">수정</a> |

                <a href="deleteform.html?<?echo("id=$id&order=$order&keyfield=$keyfield&key=$key");?>">삭제</a>

          </font>

      </td>

   </tr>

 

   </table>

  

   </td>

</tr>

</table>

  

</body>

</html>

 

 

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.