주간 베스트 월간 베스트 3개월 베스트 베스트 게시물
연길시 신화서점 조선말 도서

자신만의 메모장! - 5.메모장완성!

광수 | 2001.10.17 00:46:46 댓글: 0 조회: 530 추천: 12
분류웹 프로그래밍 https://life.moyiza.kr/itstudy/1758829
▶ 자신만의 메모장! - 5.메모장완성!


▷ 메모 출력과 함께 페이지 출력만 해결하면 메모장이 완성됩니다. ^^;


최초의 study_input.html 파일에 입력폼만 두었고, 입력된 내용은 study_write.php
파일에서 처리하도록 하였습니다.

이제 다시 study_input.html 파일에 메모 내용을 출력하는 부분을 추가해보도록
하겠습니다.

여기서부터 차근차근 읽어봐야 할 부분입니다.

먼저 study_write.php 파일에서 memo.cgi 파일에 이름(닉)과 메모, 그리고 날짜,
시간,아이피 등을 고정길이 문자열로 저장을 하였습니다. 아래 부분이 그 코드죠.

$memo_data = sprintf("%18s%15s%12s%100sn",date("Y-m-dH:i:s"),$REMOTE_ADDR,
                                         $memo_name,$memo_memo);

date("Y-m-dH:i:s") => 2001-10-0108:40:23 ... 18자리
$REMOTE_ADDR       => 123.123.123.123 ... 15자리 (최대)
$memo_name         => 12자까지.
$memo_memo         => 100자까지.

어쨌거나 하나의 메모 길이는 18+15+12+100 = 145 + 1(다음줄) = 146이 됩니다.

이게 무슨 필요가 있느냐구요? ^^; 메모 파일의 크기를 먼저 구합니다.

$filesize = filesize("memo.cgi");

이렇게 구한 크기값은 146의 배수로 이루어집니다. 메모 한건이 기록되어 있으면
146, 두건이 기록되어 있으면 292(146+146) 등으로 말이죠. 열건이 기록되어 있으면
1460이 되겠죠?

파일의 크기를 반대로 이용하는 겁니다. 파일의 크기를 메모의 고정 길이로 나누면
메모의 전체 갯수가 나옵니다. 생각해보니 간단하죠?

이제 이 전체 갯수를 이용해 페이지를 나누고, 일정 페이지 영역내의 값을 출력할 수
있게 되는 것입니다.

자. 일단 메모의 총 갯수가 30개 기록되어 있다 가정하고 일정 영역이 어떻게
구해지는지 알아볼까요?

먼저 한 화면에 10개의 메모를 출력한다면 30개의 메모가 있기 때문에 총 3개의
페이지가 나옵니다. 그리고 1 페이지에서는 30번부터 21번까지 10개의 메모가,
2 페이지에서는 20번부터 11번까지, 3 페이지에서는 10번부터 1번까지 출력됩니다.

즉 전체메모수 - (현재페이지 - 1) * 한번에 보여줄 메모수를 구하면 처음 출력할
메모의 번호가 나옵니다.

전체메모[30] - (현재페이지[1] - 1) * 한번에보여줄 메모수[10] = 30
전체메모[30] - (현재페이지[2] - 1) * 한번에보여줄 메모수[10] = 20
전체메모[30] - (현재페이지[3] - 1) * 한번에보여줄 메모수[10] = 10

이렇게 구한 처음 메모값부터 10개의 메모만 차례대로 출력하면 되는 것이죠.

메모가 35개 있을때 한번에 보여줄 메모수가 10개라면 총 4 페이지가 나옵니다.
영역은 35에서 26까지 1 페이지, 25에서 16까지 2 페이지, 15에서 6까지 3 페이지,
5에서 1까지 4 페이지... 이해되죠?

이 총 페이지의 수는 전체 메모를 한번에 보여줄 메모수로 나눈 값을 올림하면
나옵니다. 전체 메모 35 / 한번에 보여줄 메모수 10 = 3.5 올림하면 4.

여기까지의 과정을 코드로 나타내볼까요?


if (!$page) $page = 1; // 페이지가 지정되어 있지 않을 경우 1 페이지로 지정
$memo_view = 10; // 한번에 보여줄 메모수
$total_memo = filesize("memo.cgi")/146; // 총 메모수
$total_page = ceil($total_memo / $memo_view); // 총 페이지수
$start = $total_memo - ($page-1)*$memo_view; // 처음 보여줄 메모


앞서 설명한 것을 코드로 나타낸 것이니 이해가 가지 않는다면 다시 설명 부분을
차근차근 읽어보도록 하세요. ^^


이제 파일로부터 메모를 읽어와야 합니다. 메모가 저장되는 파일을 읽기 모드로
열어 처음 보여줄 메모 위치로부터 한번에 보여줄 메모수만큼 출력하면 되죠. 여기서
메모 하나의 길이가 146자리고, 일정 영역으로 나뉘어있기 때문에 이를 구분해 각
값별로 출력을 해주면 됩니다.

메모가 35개가 있을 경우 1 페이지라면 처음 보여줄 메모값은 35입니다. 이 값에서
한번에 보여줄 메모값 10을 뺀 수 25보다 큰 동안 (아울러 그 수가 양수일 경우)
for문을 반복하게 됩니다. 35에서 1을 빼고 이 값에 146을 구하면 파일 내의 해당
메모가 시작하는 위치값을 구할 수 있습니다. (만약 메모가 1개라면 처음 시작은
0이기 때문에... 그래서 1을 빼준 것입니다.)

위치값으로부터 145바이트를 읽으면 그게 하나의 메모며, 이것을 적당히 나누면 날짜,
시간,아이피,이름,메모값을 얻을 수 있습니다. 이것을 그대로 출력해주면 끝이겠죠?
코드는 아래와 같습니다.


$fp = fopen("memo.cgi","r"); // 읽기 모드로 파일 열기
for($i=$start; $i>$start-$memo_view && $i>0; $i--) {
  fseek($fp,($i-1)*146); // 포인터 이동
  $temp = fread($fp,145); // 해당 포인터로부터 145바이트 읽음
  $date = substr($temp,0,10); // 날짜 (처음부터 10자리)
  $time = substr($temp,10,8); // 시간 (그 다음부터 8자리)
  $ip   = ltrim(substr($temp,18,15)); // 아이피 (그 다음부터 15자리)
  $name = ltrim(substr($temp,33,12)); // 이름 (그 다음부터 12자리)
  $memo = ltrim(substr($temp,45,100)); // 메모 (그 다음부터 100자리)
  echo "[$i] $name ::: $memo ::: $date ($time)<br>n"; // 내용 출력
}
fclose($fp); // 파일 닫기

그 다음 페이지를 표시해주면 되겠죠? 일단 여기에선 앞뒤 가리지 않고 앞, 뒤 페이지
이동만 넣어보도록 하겠습니다. 다음에 공지사항이나 방명록 등을 다룰때 살펴볼께요.

$prev_page = $page - 1;
$next_page = $page + 1;

간단하죠? 하지만 전 페이지는 1 이하가 되면 안되고, 다음 페이지는 전체 페이지값
이상이 되면 안됩니다. 때문에 조건을 한번 더 걸어줘야하죠.

if ($prev_page < 1) $prev_page = 1;
if ($next_page > $total_page) $next_page = $total_page;

그리고 이 값에 링크를 걸어주면 끝이죠.

echo "<a href='study_input.html?page=$prev_page'>이전페이지</a>";
echo " <a href='study_input.html?page=$next_page'>다음페이지</a>";

사용하기 나름이지만 만약 현재 페이지값($page)과 이전페이지값($prev_page)이 같을
경우엔 링크를 걸지 않는 방식을 취해도 됩니다. 사실 메모장이기 때문에 페이지
이동에 그리 신경쓰지 않아도 될 것 같아 간단히 처리했습니다. ^^;

그럼 이 코드들을 study_input.html 하단에 연결해볼까요?

[input.html]
--------------------------------------------------------------------------------
<html>
<head>
<title>메모장</title>
<style>
<!--
p,input,body { font-family:굴림체; font-size:9pt; }
input   { border-width:1; border-color:black; background-color:white; height:18; }
-->
</style>
</head>
<body bgcolor=white text=black>
<table border='0' cellpadding='0' cellspacing='0'>
<form method='post' action='study_write.php'>
<tr>
<td><p>Name :</p></td>
<td><p> <input type='text' name='memo_name' size='8'></p></td>
<td><p> Memo :</p></td>
<td><p> <input type='text' name='memo_memo' size='50'></p></td>
<td><p> <input type='submit' value='Memo'></p></td>
</tr>
</form>
</table>
<?

if (!$page) $page = 1; // 페이지가 지정되어 있지 않을 경우 1 페이지로 지정
$memo_view = 10; // 한번에 보여줄 메모수
$total_memo = filesize("memo.cgi")/146; // 총 메모수
$total_page = ceil($total_memo / $memo_view); // 총 페이지수
$start = $total_memo - ($page-1)*$memo_view; // 처음 보여줄 메모

$fp = fopen("memo.cgi","r"); // 읽기 모드로 파일 열기
for($i=$start; $i>$start-$memo_view && $i>0; $i--) {
  fseek($fp,($i-1)*146);
  $temp = fread($fp,145);
  $date = substr($temp,0,10);
  $time = substr($temp,10,8);
  $ip   = ltrim(substr($temp,18,15));
  $name = ltrim(substr($temp,33,12));
  $memo = ltrim(substr($temp,45,100));
  echo "[$i] $name ::: $memo ::: $date ($time)<br>n";
}
fclose($fp); // 파일 닫기

$prev_page = $page - 1;
$next_page = $page + 1;
if ($prev_page < 1) $prev_page = 1;
if ($next_page > $total_page) $next_page = $total_page;
echo "<a href='study_input.html?page=$prev_page'>이전페이지</a>";
echo " <a href='study_input.html?page=$next_page'>다음페이지</a>";

?>
</body>
</html>
--------------------------------------------------------------------------------
- 미리보기 : http://dreamphp.com/study2/memo/study_input.html
- 소스보기 : http://dreamphp.com/study2/memo/study_input.phps


이제 메모장의 형태가 완성되었네요. 지금의 경우 원리 이해가 중심이기 때문에
메모장을 꾸미지 않았습니다. 꾸미는 것은 직접 하셔야겠죠? ^^; 테이블을 이용하거나
이미지 등으로 꾸미면 예쁜 메모장이 될 수 있습니다.

▶ 메모장 끝! 애초에 계획했던 절대주소를 지정해 어디서나 이용가능한 메모장을
만들지 못했지만, 이 정도로 먼저 기초를 닦아두면 나중 프로그램 제작이 편해지니
이것으로 만족해야겠습니다.

이해가 안되는 부분이 있다면 서슴없이 질문을 올려주세요. 추가했으면 하는 점 역시
글을 올려주시구요. 아직 갈길이 머네요... ^-^


* 전설님에 의해서 게시물 이동되었습니다 (2004-05-30 17:07)
* 이동한 이유 :
* 원래의 위치 : 웹 공부 >> 웹 프로그래밍
* 이동후 위치 : 웹 공부 >>

* 전설님에 의해서 게시물 이동되었습니다 (2004-05-30 17:12)
* 이동한 이유 :
* 원래의 위치 : 웹 공부 >>
* 이동후 위치 : 웹 공부 >> 웹 프로그래밍
추천 (12) 선물 (0명)
첨부파일 다운로드 ( 1 )
memo6.zip | 5.2KB / 17 Download
IP: ♡.149.♡.65
3,006 개의 글이 있습니다.
제목 글쓴이 날짜 조회
관리자
2003-09-20
11866
관리자
2003-09-20
11414
관리자
2003-09-20
20547
지구인
2010-08-27
19343
지구인
2009-09-07
13663
SOLIDH
2010-01-29
15622
엔죠라이프
2004-10-07
16718
노아
2001-10-27
554
노아
2001-10-27
525
노아
2001-10-27
462
노아
2001-10-27
2893
네로™
2001-10-26
958
네로™
2001-10-22
1748
네로™
2001-10-22
1671
네로™
2001-10-21
2929
네로™
2001-10-21
1594
네로™
2001-10-21
540
네로
2001-10-18
658
네로
2001-10-18
530
네로
2001-10-18
1672
네로
2001-10-18
1159
네로
2001-10-18
544
네로
2001-10-18
1033
네로
2001-10-18
957
네로
2001-10-18
2436
광수
2001-10-17
530
광수
2001-10-17
485
광수
2001-10-17
424
모이자 모바일