웹마스터 팁

어제밤에.. 잠이 안와서.. 방명록에 장난 좀 쳤는데.. 어때요?? ^^
추잡시려 보이나요??
요즘 아바타인지.. 뭔지 캐릭터를 많이 이용하길래.. 저도 한번 해봤더여..^___^


어제.. 글쓰기, 글저장을 했죠?? (안했다구요?? --;; 회원탈퇴 시킬꼬얌)
그 저장한 글들을 이제 목록으로 불러와 보겠습니다.



자.. 이게 오늘 만들.. 게시판의 리스트 부분입니다..
역시 허접하죠?? ^^ 항상 말하지만.. 겉모습이 중요한게 아니랍니다..

리스트부분의 소스는 줄인다고 줄였는데.. 한화면에 캡쳐가 안되서..
head, main, foot 이렇게 3부분으로 잘랐습니다.

우선 상단부분의 소스입니다.



자~ 이게 바로 게시판 리스트의 상단 부분이 해당하는 소스입니다.
우선 가장 첨에 주로 해주는게 글이 몇개를 있는지 가져오는 일입니다.

주로 게시판들 보면.. 상단에 "총 몇개의 글이 있습니다" 이런 문구를 많이 봤습니다.
이게.. 폼낼려고 이렇게 하는이유도 있지만 다른 이유가 있답니다.

바로.. 리스트에서 페이지를 나눠주기 위해서는 몇개의 글이 있는지
반드시!! 알아야 한답니다.
몇개가 있는지를 알아야만 나중에.. 아래로 내려가서 페이지를 나눌수가 있거든요..^^

몇개인지 구해오는건 쉽죠??
mysql_num_rows()라는 함수를 이용하면 필드 row의 갯수를 출력해주죠..^^
근데.. 사실 진정한 게시판을 만들려면 이렇게 해서는 안된답니다..

왜냐구요?? 생각을 해보세요.. 나중에 글이 100만개가 있다고 가정해보세요..
언제 100만개를 셉니까.. --;; 무지하게 로딩하는 시간 오래 걸린답니다.
그래서 나중에 좀 능숙해진다면.. 게시판의 전체 글수는 관리자 테이블이나 아니면
다른 테이블에 따로 넣어둔답니다..^^
그래서 그 갯수만 불러오면 아주 쉽고 빠르겠죵?? ^____^

제로보드나 묻지마 보드나.. 관리자 기능에서 각각의 게시판의 등록된글수가
괜히 폼낼렬고 있는게 아니랍니다.. 다 이러한 이유때문이죠..

자! 전체 갯수를 구해왔습니까??
그렇다면.. 상단부분을 HTML로 살짝 만들어보세요..

그리고 바로 밑에서.. 이제 본격적으로 리스트를 반복시키는 부분이 시작됩니다.

    // 페이지가 지정되어있지 않을때 1로 초기화시킴
    if(!$page) $page=1;

    // 전체페이지수를 구함 (리스트에 10개씩만 보여줄경우)
    $totalpages=ceil($total/10);
    // 쿼리를 시작할 수
    $start=($page-1)*10;

페이지가 지정되어있지 않을때 1로 초기화시킴
요건 무신말이냐 하면요.. 첨에.. 그러니까 가장 첨에.. 글리스트로 왔을때는
페이지가 지정되어있지 않답니다.

즉, 평소에 게시판 링크할때.. list.php?db=board 이렇게 링크하죠??
근데 원래 따지자면 list.php?db=board&page=1이렇게 되야 한다는
말이죠.. 근데 페이지까지 적어주기 귀찮응께.. 걍 db까지만 적죠..
그래서.. 페이지가 안정해져있다면.. 무조건 1번 페이지로 가라.. 이뜻이랍니다..

그리고 밑에 전체페이지수 구함, 쿼리 시작할수
요게 중요하답니다.. 아주아주...^__^ 이해도 잘 하셔야 합니다.

우리는 일단.. 쉽게 가기위해서.. 글목록을 딱 10개씩만 보여준다고 미리 선언하겠습니다.!!

페이지나누는 부분은 상당히 이해하기가 어려운데.. (사실 저도 잘 모름)
가장 쉽게 이해하는 부분은.. 변수에다가 숫자를 대입시키면서 계산해보는 방법이
가장 이해하기가 쉽습니다.

자!! 만약에 우리는 15개의 글이 있습니다.
그리고 우리는 한 화면에 10개씩만 보여줄겁니다.
그러면 전체 페이지 수가 몇페이지가 되어야 하죠??
네!! 맞습니다. 바로 2페이지가 되어야 합니다.

$totalpages=ceil($total/10);

요넘은 바로 그걸 계산하는 넘이랍니다. ceil() 이란 함수가 반올림한다는 말입니다..^^
ceil(4.2) 는 5를 출력하게 됩니다.

그래서.. 숫자를 대입해보면 전체 글 갯수 $total 에.. 15를 대입하면.. 2가 나옴을 알수있죠??
어디까지나.. 10개씩 출력할 경우에..^^
만약에.. 20개씩 출력하고 싶다면.. ceil($total/20);으로 해주시면 됩니다.

그리고 담으로     $start=($page-1)*10; <--- 요넘
요것도 중요한거랍니다..^^
이건 바로 아래 따라오는
"select * from board_$db order by no desc limit $start,10"
이 쿼리문과 연관지어서 봐야 합니다.

즉,15개의 글이 있다면 한번에 15개를 다 출력하는게 아니라 10개씩 출력해야하니까
limit를 사용해서.. 제한을 하는겁니다.
근데.. limit 10이라고 해버리면.. 무조건 앞에 10개만 가져오게 되겠죠??
그래서.. limit x, y 라는 개념으로 x 부터 시작하는 y개의 글을 가져오게 하는겁니다.

이 쿼리를 할때.. 어디서 시작해야 할지.. 즉, x 에 해당하는값을 구해야 하는분이
$start 라는 변수입니다.
자.. 이것도 변수에 수를 대입해보면 아주쉽게 구할수있답니다..

만약에 현재가 첫페이지라면.. $page에 1을 대입하면.. $start는 0이 나옵니다.

그렇다면..

"select * from board_$db order by no desc limit 0,10"

바로 이렇게 되죠?? 즉, 가장 첨부터 10개를 가져오라는 말이 되는것입니다.
여기서.. 왜 0 일까? 라고 의문을 가지시는 분이 있을겁니다..
혹시 1이 아닐까??
네.. 그렇게 생각할수도 있습니다. 글번호가 1부터 시작하니까..^^ 헤깔리죠?
근데 아닙니다. limit 인덱스의 첫숫자는 0부터 시작을 한답니다.

자.. 그럼 감이 오시죠??
그럼 만약에 두번째.. 페이지를 출력한다면..??

"select * from board_$db order by no desc limit 10,10"

이렇게 되는겁니다. 10부터시작하는 10개의 글을 가져오라는 말이 되는것입니다.

이제 감이 오시죠??

바로.. 한번에 전부를 다 쿼리하는게 아니라.. 그 페이지에 해당하는것만큼만
가져오기 위해서.. $start라는 변수를 사용하는겁니다.

페이지 나누는 부분이 이해하기도 힘들고.. 또 그만큼 중요하기때문에
이야기가 많이 길어졌습니다..

이제 쿼리를 했습니다. 이제 본격적으로 반복이 시작되면서 리스트가 출력되는
부분을 보도록 하죠..



얼~ 너무 간단하다구요??

네 맞습니다. 간단합니다. 왜냐하면 위에서 while문으로 반복을 시켰기때문입니다.
[tr]  를 반복문에 넣어주면 세로형식으로 반복이 되죠..
[td]  를 반복문에 넣어주면 가로형식으로 반복이 된답니다..^^ (참고하시라구요..)

마지막에 위에서 while문 시작할때 열어준 { 괄호를 반드시 닫아줘야 합니다.


자 이제.. 마지막 하단부분을 보도록하겠습니다.



위에서.. 페이지 나누는 부분을 시작했었는데..
이제 하단부분에서는 실제로.. 페이지 나눠서 출력을 해준답니다.
역시 첨인 분들은 이해하기가 좀 까다로우실겁니다.
그럴때는.. 변수를 모두 숫자로 지정을 한다음에 계산을 해보시면 이해가 쉬울겁니다.

if ($totalpages > 1)
{

첨에 이렇게 시작하죠?? 이건 글이 10개 이하로 있을때는 한페이지밖에 없죠??
그럴때는 하단에 페이지를 나타내지 말고.. 한페이지이상.. 즉, 글이 10개이상 될때만
페이지를 표시하라는 겁니다.

        // 10 페이지 단위로 끊는다.
        $total_count = ceil($totalpages/10);

        // 현재 페이지가 속한곳의 위치를 구한다.
        $page_count = ceil($page/10);

이말은 뭐말이냐 하면.. --;; (점점 저도 헤깔리기 시작함)
글이.. 수백개가 있을때.. 하단에

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

이렇게 나오죠?? 여기서.. 보여줄 갯수를 10개로 한다는 말입니다.
20개로 하고 싶다면.. 20으로 바꿔주면 됩니다.. 근데 주로 90% 이상 10개단위로 끊죠..^^

그렇다면.. 위에서 글이 15개가 있을때... $totalpages는 2가 된다는걸 구했죠??
그럼 이제 $total_count 를 구해보면.. 1이 나오죠??
즉,,  1 2 3 4 5 6 7 8 9 10 [다음10개]요렇게 보여주는게
한번이다 라는 그런뜻입니다.

1 2 3 4 5 6 7 8 9 10 [다음10개]요걸 1이라는 단위로 생각하세요..

        // 링크 시작 페이지, 종료페이지를 구한다.
        $start_page = ($page_count - 1) * 10 +1;
        $end_page = $start_page + 9;

자.. 이제.. 절라 최고조로 어려워지기 시작했습니다.. --;;;;;; (땀 열라 흘림)

이건.. 뭐냐.. 하면..

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

여기서 1 과 10을 구해야 한다는 말입니다.

이거 역시.. 숫자를 대입해보면 이해가 빠를겁니다.

아까.. $page_count 가 1이 나왔죠?? 1을 대입해보면.. $start_page는 1이 됨을 알수있습니다.
그리고 $end_page는 10이 됨을 알수있죠??

10개 단위로 끊는다면.. $end_page는 $start_page만 구해서 9를 더해주면 되겠죠??

자.. 그럼 복습을 위해서 숫자대입을 좀더 복잡하게 해보도록 하겠습니다.

글이.. 250개가 있습니다. $total이 250이란 말이죠??
그럼 $totalpages는 25가 됩니다..  그리고 $total_count는 3이 됩니다.

1 2 3 4 5 6 7 8 9 10 [다음10개]아까.. 제가 요걸 1단위로 생각하라고
했죠?? 바로 이겁니다. 글이 250개가 있다면 요게 3번이 나온다는 이야기입니다..

이해가 좀 오나요??? 아님 가나요??
여기까지 이해가 됐다면.. 이제 끝났습니다. 모든걸 이해한거나 다름없습니다.
이제 다음에 오는것들은 앞에서 구한값들을 가지고 링크걸고.. 뭐 하는것들입니다.


// $end_page가 $totalpages보다 크면 종료페이지값에 마지막 페이지 값을 넣는다.
if ($end_page > $totalpages)
{
$end_page = $totalpages;
}

이건.. 뭐냐면.. 총 6개 페이지밖에 없습니다.

즉, 1 2 3 4 5 6 이렇게만 있다는 거죠..
근데.. 위에서.. 계산해보면.. $start_page는 1이고 $end_page는 $start_page에 9를
더하기때문에.. $end_page가 10이 되는거죠...

원래 6개 페이지밖에 없는데 $end_page가 10이 된다는 말이죠.. 이건 오류죠??
그걸 막기위해서.. $end_page가 전체페이지보다 크다면
$end_page에 전체페이지 값을 넣는다는 말입니다.


     //이전 10개 페이지로 가기
     if($page > 10){

           $prev_page = $start_page - 1;
           // <와 >괄호는 생략함 (태그문제때문에..--;)
           echo" a href=list.php?db=$db&page=$prev_page [이전10개] /a ";

     }

      // 페이지 링크를 뿌려준다.
      for ($i=$start_page;$i<=$end_page;$i++)
        {

                if ($i==$page)
                {
                        echo" b $i /b";
                }
                else
                {
                        echo" a href='list.php?db=$db&page=$i' $i /a";
                }

        }

     //다음 10개 페이지로 가기
     if($totalpages > 10){

           $end_page = $end_page+1;
           echo" a href=list.php?db=$db&page=$end_page [다음10개] /a";

     }

자 이제.. 링크만 남았습니다..
이전 10개 페이지, 다음 10개 페이지로 이동하는건 진짜.. 쉽게 이해하시겠죠??

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

이렇게 있다면.. 이전 10개 페이지는 11에서 1빼주면 되겠죠??
그리고 다음 10개는 20에다가 1더해주면 되겠죠?? ^^

마지막으로.. 이제..

1 2 3 4 5 6 7 8 9 10  <-- 요기다가 링크거는 일만 남았습니다.

      // 페이지 링크를 뿌려준다.
      for ($i=$start_page;$i<=$end_page;$i++)
        {

                if ($i==$page)
                {
                        echo" b $i /b";
                }
                else
                {
                        echo" a href='list.php?db=$db&page=$i' $i /a";
                }

        }

for문을 통해서 반복시켜서 걸어주는것입니다.
이것도.. 변수가 있어서 까다로워 보이는데 숫자를 대입해보면 쉽습니다.

1 2 3 4 5 6 7 8 9 10 까지 있다고 생각하고 숫자를 대입해보면

$start_page는 1, $end_page는 10이죠??

그럼 for ($i=1;$i<=10;$i++) 이렇게 바뀝니다. 즉, 1부터 10까지 반복하라는 말이죠..^^
그리고 $i변수가.. $page하고 같을때.. 링크를 걸지말고 진하게 해준다는건..

현재 보고있는페이지는 링크를 걸지말고 진하게 해주라는 말이죠..^^

자!!!!!!!

게시판만들면서.. 가장 까다롭다고 생각되는 페이지 나누는 부분을 무사히 마쳤습니다..^^
이제.. 남은것들은.. 아주 쉽답니다..^_____^

가장 긴강의가 아니었나 싶네요..
중요한 부분이니까.. 꼭 자기것으로 만드세요..

그럼.. 전 이만 다음 강좌를 준비하러 갑니다 <ㅑㅇ ~~




제목 글쓴이 날짜
초보의 php를 활용한 OneFrame(NoFrame) 홈페이지 만들기 - 1 [17] 아이쿠 2002.08.30
array_multisort를 이용한 간단한 순위체크 [4] Doogi 2002.08.28
변수를 사용하여 echo로 변수값 출력하기. [7] ZipShin 2002.08.28
sleep() 제대루 쓰기... 요것두 [별루 알아도 도움 안되는 팁] [5] sMokaHallo 2002.08.24
[허접] implode() 함수로 배열을 변수로! Myzzix 2002.08.23
[허접] rand() 함수를 이용한 뒤죽박죽 날짜 출력 [5] Myzzix 2002.08.23
파일하나로 만드는 한줄 메모장(테마기능 포함) [8] Mr. JH 2002.08.22
PHP의 제어구조 [2] Mr. JH 2002.08.22
PHP 시간관련 함수 [3] Mr. JH 2002.08.22
PHP에서 사용하는 간단하지만 중요한 MySQL함수들 [3] Mr. JH 2002.08.22
꼭 알아야 하는 4가지 쿼리문 Mr. JH 2002.08.22
테이블 생성시 데이터베이스의 타입설정 [2] Mr. JH 2002.08.22
누구나 만들수있는 게시판 [글삭제, 수정 부분] [4] file Mr. JH 2002.08.21
누구나 만들수있는 게시판 [글보기 view.php 부분] [1] Mr. JH 2002.08.21
누구나 만들수있는 게시판 [글목록 list.php 부분] [6] Mr. JH 2002.08.21
누구나 만들수있는 게시판 [schema, write, write_ok] [10] Mr. JH 2002.08.21
제로 카운터 숫자 조정하기 [8] 이주경 2002.08.21
Print 이건또 뭐지? 사이트 찾다보니 있던데..^^ [13] ZipShin 2002.08.16
기초 통계 프로그램 for 귀차니스트;; [3] TheMics 2002.08.10
쓸모있는 PHP Tip (다 알구 있을런지 모르겠네여..^^) [1] 이삐아이(체리) 2002.08.09