게시판 목록 보여지는 방식
본문
게시판 갯수가 11개가 되면 페이지가 하나 더 생겨서 2페이지가 됩니다
1페이지에 1개 있고 2페이지에 10개가 있어야되는데 반대로
1페이지에 10개가 있고 2페이지에 1개가 있습니다
어디를 수정해야되나요??
list.php
<?php
</html>
include "db_info.php";
####################
#list 설정
#1. 한페이지에 보여질 게시물의 수
$page_size=10;
#2. 페이지 나누기에 표시될 페이지의 수
$page_list_size=10;
####################
//$no 값이 안 넘어 오거나 잘못된(음수)값이 넘어오는 경우 0으로 처리
$no=empty($_GET['no'])?1:$_GET['no'];
if($no<0) $no=1;
####################
//데이터베이스에서 페이지의 첫 번째 글($no)부터 $page_size만큼의 글을 가져온다
$query = "select*from $board order by thread desc limit $no,$page_size";
$result = mysql_query($query, $conn);
/*총 게시물 수를 구한다
count를 통해 구할 수 있는데 count(항목)과 같은 방법으로 사용한다 *는 모든 항목을 뜻한다
총 해당 항목의 값을 가지는 게시물의 개수가 얼마인가를 묻는 것이다
따라서 전체 글 수가 된다 count(id)와 같은 방법도 가능하지만
이례적으로 count(*)가 조금 빠르다 일반적으로는 *가 느리다*/
$result_count=mysql_query("select count(*) from $board",$conn);
$result_row=mysql_fetch_row($result_count);
$total_row=$result_row[0];
//결과의 첫 번째 열이 count(*)의 결과다
####################
#총 페이지 계산
if($total_row<=0) $total_row=0; //총 게시물의 값이 없을 경우 기본값으로 세팅
//총 게시물에 1을 뺀 뒤 페이지 사이즈로 나누고 소수점 이하를 버린다
$total_page = floor(($total_row-1)/$page_size);
/*총 페이지는 총 게시물의 수를 $page_size로 나누면 알 수 있다
총 게시물이 12개(1을 빼서 11이 된다)이고 페이지 사이즈가 10이라면 결과는 1.1이 나올 것이다
1.1라는 페이지 수는 한페이지를 다 표시하고도 글이 더 남아있다는 뜻이다
따라서 실제의 페이지 수는 2가 된다 한 페이지는 2개의 글만 표시될 것이다
그러나 내림을 해주는 이유는 페이지 수가 0부터 시작하기 때문이다 따라서 1은 두번째 페이지다
총 게시물에 1을 빼주는 이유는 10페이지가 되면 10/10 =1이기 때문이다
앞에서도 말했지만 1은 2번째 페이지를 뜻한다
그러나 총 게시물이 10개인 경우 한 페이지에 모두 출력됭야 한다
그래서 1을 빼서 10개인 경우(10-1)/10=0.9로 한 페이지에 출력한다
글이 0개가 있는 경우는 결과가 -1이 되지만 -1은 무시된다
(floor는 내림을 하는 수학함수이다)*/
####################
#현재 페이지 계산
$current_page=floor($no/$page_size);
/*$no을 통해서 페이지의 첫 번째 글이 몇 번째 글인지 전달된다
따라서 페이지 사이즈로 나누면 현재가 몇 번째 페이지인지 알 수 있다
$no이 10이고 페이지 사이즈가 10이라면 결과는 1이다 앞서 페이지는 0부터
시작이라고 했으니 두 번째 페이지임을 나타낸다
그렇다면 $no이 11이라면 1.1이 되어 버린다 11번째 글도 두 번째 페이지에 존재하므로 0.1
은 무의미하니 버린다
그런데 $no이란 값이 $page_size마큼씩 증가되는 값이기 때문에(0,10,20,30과 같은
등차수열)내림을 하는 것 또한 무의미하다
그러나 내림을 하는 이유는 $no값에 11과 같은 값이 들어와도 제대로 출력되기를 바라는
마음에서 해놓은 것이다*/
?>
<html>
<head>
<title>계층형 게시판</title>
<style>
<!--
td{font-size:9pt;}
A:link{font:9pt; color:black; text-decoration:none;
font-family:굴림; font-size:9pt;}
A:visited{text-decoration:none; color:black;
font-size:9pt;}
A:hover{text-decoration:underline; color:black;
font-size:9pt;}
-->>
</style>
</head>
<body topmargin=0 leftmargin=0 text=#464646>
<center>
<br>
<!-- 게시물 리스트를 보이기 위한 테이블 -->
<table width=580 border=0 cellpadding=2 cellspacing=1 bgcolor=#777777>
<!-- 리스트 타이틀 부분 -->
<tr height=20 bgcolor=#999999>
<td width=30 align=center>
<font color=white>번호</font>
</td>
<td width=370 align=center>
<font color=white>제목</font>
</td>
<td width=50 align=center>
<font color=white>글쓴이</font>
</td>
<td width=60 align=center>
<font color=white>날짜</font>
</td>
<td width=40 align=center>
<font color=white>조회수</font>
</td>
</tr>
<!-- 리스트 타이틀 끝 -->
<!-- 리스트 부분 시작 -->
<?
while($row=mysql_fetch_array($result))
{
?>
<!-- 행 시작 -->
<tr>
<!-- 번호 -->
<td height=20 bgcolor=white align=center>
<a href="read.php?id=<?=$row['id']?>&no=<?=$no?>">
<?=$row['id']?></a>
</td>
<!-- 번호 끝 -->
<!-- 제목 -->
<td height=20 bgcolor=white>
<?
if($row['depth']>0)
echo "<img height=1 width=" . $row[depth]*7 . ">L";
?>
<a href="read.php?id=<?=$row['id']?>&no=<?=$no?>">
<?=strip_tags($row['title']);?></a>
</td>
<!-- 제목 끝 -->
<!-- 이름 -->
<td align=center height=20 bgcolor=white>
<font color=black>
<a href="<?=$row['name']?>mailto:<?=$row[email]?>"><?=$row['name']?></a>
</font>
</td>
<!-- 이름 끝 -->
<!-- 날짜 -->
<?php
date_default_timezone_set('Asia/Seoul');
?>
<td align=center height=20 bgcolor=white>
<font color=black><?=date("Y-m-d",$row['wdate'])?></font>
</td>
<!-- 날짜 끝 -->
<!-- 조회수 -->
<td align=center height=20 bgcolor=white>
<font color=black><?=$row['view']?></font>
</td>
<!-- 조회수 끝 -->
</tr>
<!-- 행 끝 -->
<?
} // end while
// 데이터베이ㅣ스와의 연결을 끝는다
mysql_close($conn);
?>
</table>
<!-- 게시물 리스트를 보이기 위한 테이블 끝 -->
<!-- 페이지를 표시하기 위한 테이블 -->
<table border=0>
<tr>
<td width=600 height=20 align=center rowspan=4>
<font color=gray>
<?
####################
#페이지 리스트
#페이지 리스트의 첫 번째로 표시될 페이지가 몇 번째 페이지인지 구하는 부분이다
$start_page=(int)($current_page/$page_list_size)
* $page_list_size;
/*현재 페이지를 페이지 리스트 수로 나누면 현재 페이지가 몇 번째 페이지 리스트에 있는지 알게 된다
이 또한 0을 기준으로 하기에 형변환(타입 캐스팅)을 해주었다
형변환은 앞 강좌에서 배웠지만 위의 나누어지는 수가 1.2와 같이 유리수로 표시되기 때문이다
int(정수)형으로 형변환을 하면 소수점 자리가 사라진다
즉, 위에서 사용한 floor랑 같은 효과를 하게 되는 것이다
여기에 floor 함수를 취하거나 위의 floor를 형변환해도 상관없다
페이지 리스트의 마지막 페이지가 몇 번째 페이지인지 구하는 부분이다*/
$end_page=$start_page+$page_list_size-1;
if($total_page<$end_page) $end_page=$total_page;
/*보여주는 페이지 리스트 중에서 마지막 펭지가 되는 경우는 두 가지다
1. 페이지가 페이지 리스트 크기보다 더 많이 남아있을 때
10개씩 뿌려주는데 총 11페이지가 존재한다면 11페이지는 두 번째 목록 펭지에 뿌려진다
그렇다면 마지막 페이지 리스트는 10페이지 즉, 첫 번째 페이지+9번째 페이지이다
2. 10개씩 뿌려주는데 5페이지밖에 없다면?
마지막 리스트 페이지는 5페이지가 된다
이전 페이지 리스트 보여주기
페이지 리스트가 10인데 13번째 페이지에 있다면 두 번째 목록 페이지를 보고 있는 것이다
이전 목록 페이지로 가고 싶을 때 사용한다
이전 페이지 리스트가 필요할 때는 페이지 리스트의 첫 페이지가 페이지 리스트 수보다 클 때다
페이지가 적어도 페이지 리스트 수보다는 커야 이전 페이지 리스트가 존재할 테니깐 말이다
페이지 리스트의 수가 10인데 총 5페이지밖에 없다면 이전 페이지 리스트는 존재하지 않는다*/
$php_self="";
if($start_page>=$page_list_size) {
#이전 페이지 리스트값은 첫 번째 페이지 리스트에서 뒤로 리스트의 수만큼 이동하면 된다
#$page_size를 곱해주는 이유는 글 번호로 표시하기 위해서이다
$prev_list=($start_page-1)*$page_size;
echo "<a href=\"$php_self?no=$prev_list\">이전</a>\n";
}
#페이지 리스트를 출력 $no=($page_num-1)*$page_size;
for($i=$start_page; $i<=$end_page; $i++) {
$page=$page_size*$i; //페이지값을 no값으로 변환
$page_num=$i+1; //실제 페이지 값이 0부터 시작하므로 표시할 때는 1을 더해준다
if($no!=$page){ //현재 페이지가 아닐 경우만 링크를 표시
echo "<a href=\"$php_self?no=$page\">";
}
echo " $page_num "; //페이지를 표시
if($no!=$page) {
echo "</a>";
}
}
#다음 페이지 리스트가 필요할 때는 총 페이지가 미지막 리스트보다 클 때이다
#리스트를 다 뿌리고도 더 뿌려줄 페이지가 남았을 때 다음 버튼이 필요할 것이다
if($total_page>$end_page)
{
#다음 페이지 리스트는 마지막 리스트 페이지보다 한 페이지 뒤로 이동하면 된다
$next_list=($end_page+1)*$page_size;
echo "<a href=$php_self?no=$next_list>다음</a><p>";
}
?>
</font>
</td>
</tr>
</table>
<a href=write.php>글쓰기</a>
</center>
</body>
</html>
답변 3
$query = "select*from $board order by thread desc limit $no,$page_size";
==> $no 가 페이지 변수로 쓰인것 같네요..
$from_record = ($no- 1) * $page_size; // 시작 열을 구함
$query = "select*from $board order by thread desc limit $from_record ,$page_size";
$query = "select*from $board order by thread desc limit $from_record ,$page_size";
이쿼리에 쓰인 변수 $from_record ,$page_size 를 확인해 보시면
$from_record 는
$from_record = ($no- 1) * $page_size; // 시작 열을 구함
$page_size 는
#1. 한페이지에 보여질 게시물의 수
$page_size=10;
즉 1페이지는
$query = "select*from $board order by thread desc limit 0 ,10";
2페이지는
$query = "select*from $board order by thread desc limit 10 ,10";
3페이지는
$query = "select*from $board order by thread desc limit 20 ,10";
이런 쿼리가 되겠지요...
$query = "select*from $board order by thread desc limit $from_record ,$page_size";
바로아래다가
echo $query;
쿼리를 함 찍어보세요 페이지별로 쿼리가 잘 나오는지 확인해 보세요
그렇담 페이지부분에 오류가 있는거 같네요...
하단 페이지 부분에 마우스 올려서 $no 변수값이 제대로 넘어가는 지 확인해 보세요
1페이지 ?no=1
2페이지 ?no=2
3페이지 ?no=3
이렇게 잘넘어간다고 한다면
echo $no; // 페이지값
$from_record = ($no- 1) * $page_size; // 시작 열을 구함
$query = "select*from $board order by thread desc limit $from_record ,$page_size";
echo $query;
이렇게 해서 함찍어보세요..
$from_record 값에 위의 계산식에 맞게 나온다면 0,10,20,30 이렇게 됩니다.
0,90,190,290 으로 나오는 경우는 위에서 오류가 있다는 뜻이고요...
페이지리스트 부분에 보면
for($i=$start_page; $i<=$end_page; $i++) {
$page=$page_size*$i; //페이지값을 no값으로 변환
$page_num=$i+1; //실제 페이지 값이 0부터 시작하므로 표시할 때는 1을 더해준다
if($no!=$page){ //현재 페이지가 아닐 경우만 링크를 표시
echo "<a href=\"$php_self?no=$page\">";
}
echo " $page_num "; //페이지를 표시
if($no!=$page) {
echo "</a>";
}
}
실제 페이지가 1,20,30,40 이런식으로 넘어가게 되네요...
echo "<a href=\"$php_self?no=$page\">"; 이부분을
echo "<a href=\"$php_self?no=$page_num\">"; 로 바꿔보세요