회원로그인
15년 전
자 이전시간까지는.....
mysql에서 데이터를 가져오는 방법까지 알아보았습니다...
근데 항상 최근 10개만 보여지게 되죠.....
다른페이지로 가고 싶어도 갈 방법이 없습니다...-_-;;
그럼 다른 페이지로 넘어가는 방법이 뭐가 있었죠?....잘생각해보세요.....
$pagenum이라는 변수가 기억나시죠.....^^
$pagenum=0이면 최근 10개만 보여집니다.
$pagenum=1이면 최근 11개부터 10개만 보여집니다.
$pagenum=2이면 최근 21개부터 10개만 보여집니다......
......
그럼 $pagenum이라는 변수만 잘 조정해주면 우리는 다른페이지로 넘어갈 수가 있겠죠...
주소창에 get방식으로 다음과 같이 입력해 볼까요?
list.php?pagenum=1
두번째 페이지가 나올겁니다.......
그런데 이렇게 다른 페이지를 볼때마다 주소를 입력해 주기가 불편하죠...
그래서 페이지 이동버튼을 만드는 겁니다 -_-;;
자 그럼 일단 페이지 버튼의 모양부터 구상해보죠...
[1] [2] [3] [4] [5]
이런식으로 만들까 하는데.....
한번에 이렇게 5페이지만 보여집니다...
그럼 6번 페이지로 이동은?
[1] [2] [3] [4] [5] [▶▶]
여기서 >>를 클릭하면 [6] [7] [8] [9] [10] 이렇게 나오게 하죠...
앞으로 이동은 [◀◀] 을 만들면 됩니다...
쉬울것 같지만 -_-그렇지가 않더군요....저도 이부분에서 몇일밤을 샜습니다 -_-;
일단 한페이지에 보여질 목록수를 정합니다...
우린 5개로 했죠....
$pageviewsu=5; //한페이지에 보여질 목록수
그런데 그 목록그룹이 몇번째 그룹인지 정해 주어야 합니다.
예를들어 2번페이지면 1번그룹이고 8번페이지는 2번째 그룹이겠죠...
$pagegroup=ceil(($pagenum+1)/$pageviewsu); //페이지 그룹결정
대입해 볼까요?......
2번째 페이지이면 $pagenum이 1,1+1은 2, 2/5($pageviewsu)이니까 0.4가 나옵니다 ceil()함수로 올림해 버리면
1이 나오겠죠......그래서 이 그룹은 1번 그룹 즉~ 1에서 5번 페이지까지 입니다.
8번째 페이지이면 $pagenum이 7,7+1은 8, 8/5($pageviewsu)이니까 1.6이 나옵니다 ceil()함수로 올림해 버리면
2가 나오겠죠......그래서 이 그룹은 2번 그룹 즉~ 6에서 10번 페이지까지 입니다.
그럼 그 그룹에 표시될 시작과 끝을 정해 줘야겠죠...
$pagestart=($pageviewsu*($pagegroup-1))+1;
목록에 표시될 페이지시작지점 입니다...
2($pagenum)번페이지였다면 페이지그룹($pagegroup)은 1이죠...
페이지그룹($pagegroup)에서 -1을 해주면 0이 됩니다.
그리고 보여질 목록수($pageviewsu)를 곱해주면 0이죠 +1을 하면 1입니다....그래서 그 그룹의 시작은 1페이지입니다.
8($pagenum)번페이지였다면 페이지그룹($pagegroup)은 2죠...
페이지그룹($pagegroup)에서 -1을 해주면 1이 됩니다.
그리고 보여질 목록수($pageviewsu)를 곱해주면 5죠 +1을 하면 6입니다....그래서 그 그룹의 시작은 6페이지입니다.
이제 시작을 정했으니 끝은 어떻게 할까요?.....
간단하죠.....시작페이지에 목록수만 더해주고 1을 빼주면 됩니다.
$pageend=$pagestart+$pageviewsu-1;
2($pagenum)번페이지였다면 그룹의시작은($pagestart) 1페이지니까 +목록수($pageviewsu)를 해주면 6이죠 -1이니까 그 그룹의 끝은 5페이지입니다.
8($pagenum)번페이지였다면 그룹의시작은($pagestart) 6페이지니까 +목록수($pageviewsu)를 해주면 11이죠 -1이니까 그 그룹의 끝은 10페이지입니다.
이부분역시 종이에 잘 대입해 가면서 적어보세요......그래야 이해가 가실겁니다...
일단 위 식들을 정리해 놓죠...
$pageviewsu=5; //한페이지에 보여질 목록수
$pagegroup=ceil(($pagenum+1)/$pageviewsu); //페이지 그룹결정
$pagestart=($pageviewsu*($pagegroup-1))+1; //시작페이지결정
$pageend=$pagestart+$pageviewsu-1; //종료페이지결정
for($i=$pagestart;$i<=$pageend;$i++)
{echo $i;}
이렇게 for문으로 시작부터 끝까지 해서 $i를 찍어내면 그 그룹에 맞는 페이지리스트가 출력됩니다..
그런데 문제가 좀 있죠...
현재 20개의 글이 있으면 한페이지당 10개의 글이니까 총 2개의 페이지가 존재합니다.
그런데 페이지시작에 1페이지고 페이지끝이 5페이지죠.....그래서 5페이지까지 출력되 버립니다.
그걸 막기위해 for문에 break를 걸어 버리겠습니다.
총 페이지수($pagesu)보다 $i가 크면 break겠죠...(반복문에서 break를 만나면 반목문은 종료됩니다)
if($pagesu<$i){break;}
이 조건문을 for문에 넣어봅시다...
$pageviewsu=5; //한페이지에 보여질 목록수
$pagegroup=ceil(($pagenum+1)/$pageviewsu); //페이지 그룹결정
$pagestart=($pageviewsu*($pagegroup-1))+1; //시작페이지결정
$pageend=$pagestart+$pageviewsu-1; //종료페이지결정
for($i=$pagestart;$i<=$pageend;$i++)
{
if($pagesu<$i){break;}
echo $i;
}
글($total)이 20개였다면 한페이지당글수($page)가 10이니까 총페이지갯수($pagesu)는 2가 됩니다.
그래서 for문을 돌다가 $i가 3이 되는 순간 break가 걸려서 반복문을 빠져나옵니다.
결국 밑에는 1과 2만 찍히는거죠..
지금상태로는 12라고 나왔으니 좀더 이뿌게 만들어줘보도록 하죠...
for문의 {}만 보도록 합시다....
{
if($pagesu<$i){break;}
echo $i;
}
이부분을 아래와 같이 바꿉니다.
{
if($pagesu<$i){break;}
echo "[$i] ";
}
[1] [2] 이런식으로 찍혔을겁니다.....
자 그럼 이제 링크를 걸어줘야 겠죠.......
링크는 <a href=list.php>에다가 ?를 사용하여 get방식으로 변수를 전달합니다.
여기서는 $pagenum이란 변수를 넘겨줘야 하는데......
1번페이지의 $pagenum=0입니다.
2번페이지의 $pagenum=1이고요......
그러니 결국 $i페이지의 $pagenum은 $i-1이 되겠죠...
그럼 다음과 같이 링크를 걸어주면 되겠죠...
{
if($pagesu<$i){break;}
$j=$i-1;
echo "[<a href=list.php?pagenum=$j>$i</a>] ";
}
그럼 결과적으로 화면에 다음과 같은 소스로 해석되어 나옵니다.
[<a href=list.php?pagenum=0>1</a>]
[<a href=list.php?pagenum=1>2</a>]
지금까지의 소스를 쫘악 보여드리죠
>>> list.php소스
<form method=post action=write.php>
이름 <input type=text name=name size=10 maxlength=10>
메모 <input type=text name=memo size=30 maxlength=50>
<input type=submit value=입력>
</form>
<?
include"connect.php";//DB에 접속
$query="select count(*) from exam_memo"; //쿼리문저장
$total=mysql_fetch_array(mysql_query($query)); //쿼리문입력
$total=$total["count(*)"]; //갯수저장
$page=10; //페이지당 갯수
$pagesu=ceil($total/$page); //페이지수를 구합니다. 결과:4
$start=($page*$pagenum); //가져올 시작위치를 결정합니다.
echo"총 <b>$total</b>개의 메모
<table border=1>
<tr><td>번호</td><td>이름</td><td>메모</td><td>시간</td></tr>
"; //테이블시작
$query="select * from exam_memo order by no desc limit $start,$page"; //꺼내올 쿼리문
$result=mysql_query($query,$connect); //mysql에 요청
while($data=mysql_fetch_array($result)) //결과를 꺼내옴
{
$data[date]=date('y-m-d',$data[date]);//시간가공
$data[name]=stripslashes($data[name]);//이름에서 제거
$data[memo]=stripslashes($data[memo]);//메모에서 제거
echo "<tr><td>$data[no]</td><td>$data[name]</td><td>$data[memo]</td><td>$data[date]</td></tr>";//꺼내온것출력
}
echo"</table>";//테이블끝
$pageviewsu=5; //한페이지에 보여질 목록수
$pagegroup=ceil(($pagenum+1)/$pageviewsu); //페이지 그룹결정
$pagestart=($pageviewsu*($pagegroup-1))+1; //시작페이지결정
$pageend=$pagestart+$pageviewsu-1; //종료페이지결정
for($i=$pagestart;$i<=$pageend;$i++)
{
if($pagesu<$i){break;}
$j=$i-1;
echo "[<a href=list.php?pagenum=$j>$i</a>] ";
}
?>
>>> list.php소스끝
처음나오는 echo부분에 "총 <b>$total</b>개의 메모"라는 부분은 메모의 총갯수를 표시해 주는것입니다.
자 그럼 이제 글을 한 60개만 넣어보죠....(더 많이 넣어도 됩니다..)
그럼 하단에 페이지이동 버튼이 1~5까지 만들어질겁니다...
그런데 페이지는 6번페이지까지 만들어져야 겠죠....60개고 페이지당10개씩이니까
이제 다음 그룹으로 넘어가도록 해주어야 합니다....
우리가 원하는건 [1] [2] [3] [4] [5] 다음에 [▶▶]라는 버튼입니다...
다음그룹으로 넘어가야죠...
그럼 다시 하단 버튼의 for문 부분만 보도록 하겠습니다.
for($i=$pagestart;$i<=$pageend;$i++)
{
if($pagesu<$i){break;}
$j=$i-1;
echo "[<a href=list.php?pagenum=$j>$i</a>] ";
}
자 이 반복문이 돌아간 다음에 [▶▶]가 찍혀야겠죠...
목록이 나온 다음 그룹으로 넘어가려면....$pageend라는 변수를 생각하시면됩니다...
목록그룹의 끝이었죠......1번 그룹에서 5로 끝났으니 그냥 간단하게 다음그룹으로 넘기려면
6번째 페이지로 넘겨주면 됩니다...
결국 ($pageend+1)번째 페이지로 넘기면 되겠죠....그런데 $pagenum은 보려는페이지-1이었죠...
($pageend+1)번째 페이지의 $pagenum은 ($pageend+1)-1 즉...$pageend로 해주시면 됩니다...
<a href=list.php?pagenum=$pageend>▶▶</a> 이렇게 해주시면된다는거죠
그런데 여기서 조건이 있습니다.
다음 그룹이 존재할때만 이 버튼을 표시해 주어야 한다는거죠...
그럼 다음그룹이 존재한다는걸 어떻게 구분할까요........-_-a
마지막 페이지($pageend)가 총 페이지($pagesu)보다 작으면 그 다음 페이지가 존재하는거겠죠...^^
그 다음 페이지가 존재한다는건 그 다음에 그룹이 더 있다는거죠....
그래서 아래와 같은 if문에 넣어줍니다...
if($pageend<$pagesu){echo"[<a href=list.php?pagenum=$pageend>▶▶</a>] ";}
실행해 보시면 [1] [2] [3] [4] [5] [▶▶] 와 같이 나오고 [▶▶]를 클릭하면 [6]번 페이지로 넘어갑니다.
그런데 이제 1~5번 페이지로 돌아갈 방법이 없죠.....그래서 이제 반대로 [◀◀] 버튼을 만들어 보겠습니다.
이전 목록그룹으로 돌아가려면 이전목록그룹의 처음 페이지를 알아야 합니다...
지금 [6]이 표시되어 있으니까 이전목록그룹의 처음 페이지는 [1]이겠죠....
만약 [11]이 표시되어 있다면 이전목록그룹의 처음페이지는 [6]일겁니다.....@_@뭐가 보이시죠?
그렇슴다...지금 목록그룹의 시작($pagestart)에서 표시될목록갯수($pageviewsu)만큼 빼주면 이전 그룹의 시작페이지가 나옵니다.
그리고 여기서 $prev는 $pagenum에 들어가야 할 값이니까 -1을 해줍니다...(잊지 않으셨죠? 3페이지의 $pagenum는 2입니다....)
그럼 링크를 아래와 같이 걸면 되겠죠....
$prev=$pagestart-$pageviewsu-1;//이전목록그룹의 시작페이지결정
echo"[<a href=list.php?pagenum=$prev>◀◀</a>] ";
그런데 여기서도 조건이 있습니다....
지금 1번그룹에 있다면 [◀◀]버튼이 있으면 안되겠죠.......그래서 $pagegroup>1 때만 화면에 표시합니다...
if($pagegroup>1){
$prev=$pagestart-$pageviewsu;//이전목록그룹의 시작페이지결정
echo"[<a href=list.php?pagenum=$prev>◀◀</a>] ";
}
위 구문을 for문 앞에 써주시면 되겠죠......
자그럼 한가지만 더 추가해 볼까요?
[◀]와 [▶] 버튼으로 바로이전 페이지와 바로다음 페이지로의 이동을 구현해 봅시다.....
간단하죠?........
[◀]버튼은 현재페이지($pagenum)에 -1을 해주어서 링크를 걸어주면되고.....
[▶]버튼은 현재페이지($pagenum)에 +1을 해주어서 링크를 걸어주면됩니다.....
이것역시.....if문을 사용해서 해야겠죠....현재 첫번째 페이지라면 [◀]버튼이 필요없고
마찬가지로 마지막 페이지라면 [▶]버튼이 필요가 없습니다.
움 소스를 생각해보죠......
[◀]버튼의 링크는 다음과 같습니다.
$prevpage=$pagenum-1;
echo"[<a href=list.php?pagenum=$prevpage>◀</a>] ";
조건은? $pagenum이 0이면 안되겠죠...그래서....결국
if($pagenum){
$prevpage=$pagenum-1;
echo"[<a href=list.php?pagenum=$prevpage>◀</a>] ";
}
이렇게 되겠죠.....이 소스는 [◀◀]소스 바로 뒤와 for문 사이에 들어가면 되겠죠...
이번엔 [▶]버튼.....
$nextpage=$pagenum+1;
echo"[<a href=list.php?pagenum=$nextpage>▶</a>] ";
조건은? 지금 페이지는 마지막페이지가 아니어야 겠죠...
총 페이지수는 $pagesu입니다....
그리고 지금페이지는 $pagenum이 아니라 $pagenum+1이죠..? (예를들어 5번페이지일때 $pagenum=4이니까..)
그래서 결국 $pagenum+1과 $pagesu가 같으면 [▶]버튼은 표시되지 않습니다.
$pagenum+1과 $pagesu가 다를때 표시하도록 하면 되겠군요...
if(($pagenum+1)!=$pagesu){
$nextpage=$pagenum+1;
echo"[<a href=list.php?pagenum=$nextpage>▶</a>] ";
}
이소스는 for문과 [▶▶]버튼 소스 사이에 위치시킵니다.
자 그럼 마지막으로 한가지만 더 해보도록 하겠습니다....
현재 3번째 페이지에 위치하고 있다면 [3]은 클릭될 이유가 없겠죠...
그리고 현재가 몇번째 페이지에 있는가를 보여주기 위해 약간 모양을 바꿔줘야 겠습니다...
for문을 한번 볼까요.....
for($i=$pagestart;$i<=$pageend;$i++)
{
if($pagesu<$i){break;}
$j=$i-1;
echo "[<a href=list.php?pagenum=$j>$i</a>] ";
}
echo문에 조건을 하나 걸어줍니다.....
제가 [3]을 클릭해서 3번째 페이지로 이동했습니다....
그럼 페이지 이동버튼에서 3번째 페이지로 이동하는 [3]이란 버튼의 링크를 빼보도록하죠...
if문을 써야 하겠는데.....
지금의 $pagenum=2겠죠...(3번째페이지니까)
그러니까 $i-1과 $pagenum이 같다면.....지금의 페이지로 이동하는 버튼이 되겠죠....
3번째 페이지니까 $i=3일때 현재 페이지고....$i-1은 2이고....지금 $pagenum=2니까 말이죠...
둘이 같으면 됩니다....
조건을 줘보죠.....아까 공교롭게도 $j에 $i-1을 넣어놨네요.....이걸 사용합니다..
if($j==$pagenum) 맞죠?....이식이 참이면 현재 페이지를 나타내는 버튼입니다.
echo "[<a href=list.php?pagenum=$j>$i</a>] ";
이부분을 다음과 같이 수정해볼까요...
if($j==$pagenum){echo "$i ";}
페이지이동버튼을 출력하다가 현재 페이지이면 링크를 걸지 않고 숫자만 보이도록 했습니다...
그럼 아닐땐?
if($j==$pagenum){echo "$i ";}
else{echo "[<a href=list.php?pagenum=$j>$i</a>] ";}
else로 아까 있던 문장을 그대로 써주면 되겠죠...
자 그럼 완성된 소스가 나갑니다.........쭈우욱~~~~
>>> list.php소스
<form method=post action=write.php>
이름 <input type=text name=name size=10 maxlength=10>
메모 <input type=text name=memo size=30 maxlength=50>
<input type=submit value=입력>
</form>
<?
include"connect.php";//DB에 접속
$query="select count(*) from exam_memo"; //쿼리문저장
$total=mysql_fetch_array(mysql_query($query)); //쿼리문입력
$total=$total["count(*)"]; //갯수저장
$page=10; //페이지당 갯수
$pagesu=ceil($total/$page); //페이지수를 구합니다. 결과:4
$start=($page*$pagenum); //가져올 시작위치를 결정합니다.
echo"총 <b>$total</b>개의 메모
<table border=1>
<tr><td>번호</td><td>이름</td><td>메모</td><td>시간</td></tr>
"; //테이블시작
$query="select * from exam_memo order by no desc limit $start,$page"; //꺼내올 쿼리문
$result=mysql_query($query,$connect); //mysql에 요청
while($data=mysql_fetch_array($result)) //결과를 꺼내옴
{
$data[date]=date('y-m-d',$data[date]);//시간가공
$data[name]=stripslashes($data[name]);//이름에서 제거
$data[memo]=stripslashes($data[memo]);//메모에서 제거
echo "<tr><td>$data[no]</td><td>$data[name]</td><td>$data[memo]</td><td>$data[date]</td></tr>";//꺼내온것출력
}
echo "<tr><td colspan=4 align=center>";
$pageviewsu=5; //한페이지에 보여질 목록수
$pagegroup=ceil(($pagenum+1)/$pageviewsu); //페이지 그룹결정
$pagestart=($pageviewsu*($pagegroup-1))+1; //시작페이지결정
$pageend=$pagestart+$pageviewsu-1; //종료페이지결정
if($pagegroup>1){
$prev=$pagestart-$pageviewsu-1;//이전목록그룹의 시작페이지결정
echo"[<a href=list.php?pagenum=$prev>◀◀</a>] ";
}
if($pagenum){
$prevpage=$pagenum-1;
echo"[<a href=list.php?pagenum=$prevpage>◀</a>] ";
}
for($i=$pagestart;$i<=$pageend;$i++)
{
if($pagesu<$i){break;}
$j=$i-1;
if($j==$pagenum){echo "$i ";}
else{echo "[<a href=list.php?pagenum=$j>$i</a>] ";}
}
if(($pagenum+1)!=$pagesu){
$nextpage=$pagenum+1;
echo"[<a href=list.php?pagenum=$nextpage>▶</a>] ";
}
if($pageend<$pagesu){echo"[<a href=list.php?pagenum=$pageend>▶▶</a>] ";}
echo"</td></tr></table>";//테이블끝
?>
>>> list.php소스끝
휴우~......-_-정말 길었네요......
예전에 n@board 를 처음 만들때 이 목록 이동 로직에 대해서 한동안 애를 먹었습니다..
어디 마땅히 설명이 나온곳도 없고말이죠.....
그리고 혼자 끙끙거리다가 -_-; 겨우 완성했었던 기억이........
그런데 해놓고 나니.....별로 대단한건 아니더군요....
그냥 계산좀 하다보면 술술술 나오는 것이었습니다....
문제는 어떻게 하나의 로직으로 구성을 짓느냐는 것이죠.....
사실 이렇게 강좌만 보시면 잘 이해가 안가실겁니다.....
좋은 방법 하나 알려드리면.......
일단 강좌를 프린트 합니다.....
그리고 지하철이나 이동중에 또는 틈틈이 자알 반복해서 읽어보세요....
그러다 보면 조금씩 이해가 가실겁니다.....
그리고 꼭 한번 자기가 실행해보는것도 좋겠죠.....
추천 : 464
추천
목록