[질답게시판 만들기] 06. list.php

06. list.php

 

드디어 게시판 만들기에 돌입합니다.

리스트를 출력하는 파일입니다.

 

<?php
include_once "_head.php";

최상단에 _head.php 를 include 합니다.

 

$page	= isset($_GET['page']) && $_GET['page'] ? $_GET['page'] : 1;	// 현재 페이지
$page_rows = 10;	// 한번에 표시할 목록수
$start	= ( $page - 1) * $page_rows;	// 검색을 시작할 INDEX (쿼리문에 사용)

넘어온 $_GET 변수를 정리하고, 페이지네이션을 위한 데이타를 정리합니다.

$_GET[‘page’] 가 정의되어 있지 않으면 기본값으로 1로 적용시킵니다.

한번에 표시할 목록수는 10으로 정의하였습니다.

 

// 게시글 목록을 가져옵니다.
$query = "SELECT SQL_CALC_FOUND_ROWS * FROM `tbl_board_post` WHERE `post_status` = 'Y' ";
$query .= " ORDER BY `post_idx` DESC ";
$query .= " LIMIT {$start}, {$page_rows} ";
// 쿼리 실행
$result = $dbcon->query($query);

게시글 목록을 가져오는 쿼리문입니다.

맨 첫 포스팅에 DB구조에서도 명시되어있지만

게시글 삭제여부는 post_status 를 통해 필터링 합니다.

post_status =’N’ 은 삭제된 게시글이므로

post_status = ‘Y’ 를 조건으로 가져옵니다.

 

// 게시글 총 개수를 구해온다.
$tmp_result = $dbcon->query("SELECT FOUND_ROWS() AS `cnt`");
$tmp_row = $tmp_result->fetch_array();
$total_count = (int) $tmp_row['cnt'];
$total_page = ceil($total_count / $page_rows);

게시글 총개수를 가져옵니다.

위에 리스트를 출력하는 구문중 SQL_CALC_FOUND_ROWS 를 이용한다면

SELECT FOUND_ROWS() 라는 명령어를 이용하여 간단하게 총 행수를 구해올수 있습니다.

 

총 게시글 수를 가져오는 방법으로 SELECT COUNT(*) 를 하는 방법도 있지만, 조건이나 인덱스 설정에 따라 쿼리실행속도가 다르지만,

이번 포스팅에서는 SQL_CALC_FOUND_ROWS 를 이용하도록 하겠습니다.

 

// 리스트 출력을 위해 정리
$list = array();
$i=0;
while($row = $result->fetch_array()) 
{
	$row['nums'] = $total_count - $start - $i;	// 글번호 매기기
	$row['is_new'] = (time() - strtotime($row['post_regtime']) < (60 * 60 * 24)) ? TRUE : FALSE;
	$row['is_reply'] = ($row['post_count_comment'] > 0) ? TRUE : FALSE;
	$list[] = $row;
	$i++;
}

리스트 출력을 위해 필요한 데이타를 정리해줍니다.

$list 라는 변수에 정리한 데이타를 집어넣을 예정이구

여기서 글번호나, 신규글여부, 댓글이 달려있는지 여부를 확인하여 처리하여 넣어줍니다.

물론 view단에서 반복문을 돌리는중에 넣어도 좋지만,

연산부분과 표시부분은 가급적 분리해주는게 협업에도 유리하지 않을까 싶습니다.

 

표시부분

?>
<style>
.td-post-title {text-align: left; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
.post-title { color:#282828; text-decoration:none;  }
.post-title .fa.fa-lock { color:#797979; }
.post-title:hover { text-decoration:none; color:#797979;}
</style>
<div class="panel panel-default">
	<div class="panel-heading">
		<h4 class="panel-title">게시판</h4>
	</div>
	<table class="table table-condensed table-bordered table-hover" style="table-layout:fixed">
		<thead>
			<tr>
				<th class="col-xs-1 text-center">글번호</th>
				<th class="col-xs-1 text-center">답변여부</th>
				<th class="col-xs-5 text-center">글제목</th>				
				<th class="col-xs-2 text-center">글쓴이</th>
				<th class="col-xs-2 text-center">등록일시</th>				
				<th class="col-xs-1 text-center">조회수</th>
			</tr>
		</thead>
		<tbody>
			<?php if( $result->num_rows == 0 ) : ?>
			<tr>
				<td colspan="5" class="text-center">등록된 글이 없습니다.</td>
			</tr>
			<?php else :?>
				<?php foreach($list as $row) : ?>
				<tr>
					<td class="text-center"><?=number_format($row['nums'])?></td>
					<td class="text-center">
						<?php if($row['is_reply']) :?>
						<label class="label label-success">답변완료</label>
						<?php else:?>
						<label class="label label-default">답변대기</label>
						<?php endif;?>
					</td>
					<td class="text-left td-post-title">
						<a class="post-title" href="<?=BASEURL?>/read.php?idx=<?=$row['post_idx']?>">
						<?=$row['post_title']?>
						<?=($row['post_is_secret']=='Y')?'&nbsp;<i class="fa fa-lock"></i>&nbsp;':''?> <!--비밀글-->
						<?=($row['is_new'])?'<label class="label label-warning">NEW</label>':''?>	<!-- 신규글-->
						</a>
					</td>
					<td class="text-center"><?=$row['mem_nickname']?></td>
					<td class="text-center"><?=$row['post_regtime']?></td>
					<td class="text-center"><?=number_format($row['post_hit'])?></td>
				</tr>
				<?php endforeach;?>
			<?php endif;?>
		</tbody>
	</table>
	<div class="panel-footer">
		<?=get_pagination($page,$total_page)?>
		<div class="pull-right">
			<a class="btn btn-success" href="<?=BASEURL?>/write.php">새글 쓰기</a>
		</div>
		<div class="clearfix"></div>
	</div>
</div>

<?php
include_once "_foot.php";

가져온 리스트를 이용하여 알맞게 표시하면됩니다….

중간에 is_new 나 is_secret 를 이용하여 조건에 맞는 라벨을 표시합니다.

(위의 경우는 is_new 인경우는 NEW 라벨을, is_secret 인경우는 자물쇠 아이콘을 표시하도록 하였습니다)

또한 is_reply 를 이용하여 [답변완료] [답변대기]를 구분하여 표시하도록 하였습니다.

 

 

최종 완성본

<?php
include_once "_head.php";

// 넘어온 변수를 정리합니다.
$page	= isset($_GET['page']) && $_GET['page'] ? $_GET['page'] : 1;	// 현재 페이지
$page_rows = 5;	// 한번에 표시할 목록수
$start	= ( $page - 1) * $page_rows;	// 검색을 시작할 INDEX (쿼리문에 사용)

// 게시글 목록을 가져옵니다.
$query = "SELECT SQL_CALC_FOUND_ROWS * FROM `tbl_board_post` WHERE `post_status` = 'Y' ";
$query .= " ORDER BY `post_idx` DESC ";
$query .= " LIMIT {$start}, {$page_rows} ";
// 쿼리 실행
$result = $dbcon->query($query);

// 게시글 총 개수를 구해온다.
$tmp_result = $dbcon->query("SELECT FOUND_ROWS() AS `cnt`");
$tmp_row = $tmp_result->fetch_array();
$total_count = (int) $tmp_row['cnt'];
$total_page = ceil($total_count / $page_rows);
// 리스트 출력을 위해 정리
$list = array();
$i=0;
while($row = $result->fetch_array()) 
{
	$row['nums'] = $total_count - $start - $i;	// 글번호 매기기
	$row['is_new'] = (time() - strtotime($row['post_regtime']) < (60 * 60 * 24)) ? TRUE : FALSE;
	$row['is_reply'] = ($row['post_count_comment'] > 0) ? TRUE : FALSE;
	$list[] = $row;
	$i++;
}
?>
<style>
.td-post-title {text-align: left; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
.post-title { color:#282828; text-decoration:none;  }
.post-title .fa.fa-lock { color:#797979; }
.post-title:hover { text-decoration:none; color:#797979;}
</style>
<div class="panel panel-default">
	<div class="panel-heading">
		<h4 class="panel-title">게시판</h4>
	</div>
	<table class="table table-condensed table-bordered table-hover" style="table-layout:fixed">
		<thead>
			<tr>
				<th class="col-xs-1 text-center">글번호</th>
				<th class="col-xs-1 text-center">답변여부</th>
				<th class="col-xs-5 text-center">글제목</th>				
				<th class="col-xs-2 text-center">글쓴이</th>
				<th class="col-xs-2 text-center">등록일시</th>				
				<th class="col-xs-1 text-center">조회수</th>
			</tr>
		</thead>
		<tbody>
			<?php if( $result->num_rows == 0 ) : ?>
			<tr>
				<td colspan="5" class="text-center">등록된 글이 없습니다.</td>
			</tr>
			<?php else :?>
				<?php foreach($list as $row) : ?>
				<tr>
					<td class="text-center"><?=number_format($row['nums'])?></td>
					<td class="text-center">
						<?php if($row['is_reply']) :?>
						<label class="label label-success">답변완료</label>
						<?php else:?>
						<label class="label label-default">답변대기</label>
						<?php endif;?>
					</td>
					<td class="text-left td-post-title">
						<a class="post-title" href="<?=BASEURL?>/read.php?idx=<?=$row['post_idx']?>">
						<?=$row['post_title']?>
						<?=($row['post_is_secret']=='Y')?'&nbsp;<i class="fa fa-lock"></i>&nbsp;':''?> <!--비밀글-->
						<?=($row['is_new'])?'<label class="label label-warning">NEW</label>':''?>	<!-- 신규글-->
						</a>
					</td>
					<td class="text-center"><?=$row['mem_nickname']?></td>
					<td class="text-center"><?=$row['post_regtime']?></td>
					<td class="text-center"><?=number_format($row['post_hit'])?></td>
				</tr>
				<?php endforeach;?>
			<?php endif;?>
		</tbody>
	</table>
	<div class="panel-footer">
		<?=get_pagination($page,$total_page)?>
		<div class="pull-right">
			<a class="btn btn-success" href="<?=BASEURL?>/write.php">새글 쓰기</a>
		</div>
		<div class="clearfix"></div>
	</div>
</div>

<?php
include_once "_foot.php";

 

[catlist id=76 numberposts=14 conditional_title=”PHP 질문과 답변 게시판 만들기” orderby=date]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.