반응형
게시판들은 대부분 새로운 글이 올라오면 새글이 올라왔다고 표시를 해준다. 그리고 댓글도 몇개가 달렸는지 숫자로 달아주고 또 새로운 댓글이 달리면 숫자에 색깔을 넣어서 구분해주기도 한다. 이런 작업을 해보자.
우선 게시물이 새로운 게시물일때 new버튼을 달아보자.
먼저 index.php에서 게시물을 가져오는 쿼리를 조금 수정한다.
기존에는
select * from board b where status=1 order by ifnull(parent_id, bid) desc, bid asc;
이렇게 돼 있는 쿼리를
select b.*, if((now() - regdate)<=86400,1,0) as newid from board b where status=1 order by ifnull(parent_id, bid) desc, bid asc;
이렇게 바꿔준다. 현재 시간에서 regdate를 빼서 86400(하루)가 작거나 같으면 1이다. 즉 새로운 게시물이다. 그러고 나면 간단하다. newid에 값이 있는 게시물만 new버튼을 달아주면 된다. 아래와같이 index.php를 수정하자.
/index.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";
$search_keyword = $_GET['search_keyword'];
if($search_keyword){
$search_where = " and (subject like '%".$search_keyword."%' or content like '%".$search_keyword."%')";
}
$pageNumber = $_GET['pageNumber']??1;//현재 페이지, 없으면 1
if($pageNumber < 1) $pageNumber = 1;
$pageCount = $_GET['pageCount']??10;//페이지당 몇개씩 보여줄지, 없으면 10
$startLimit = ($pageNumber-1)*$pageCount;//쿼리의 limit 시작 부분
$firstPageNumber = $_GET['firstPageNumber'];
$sql = "select b.*, if((now() - regdate)<=86400,1,0) as newid from board b where 1=1";
$sql .= " and status=1";
$sql .= $search_where;
$order = " order by ifnull(parent_id, bid) desc, bid asc";
$limit = " limit $startLimit, $pageCount";
$query = $sql.$order.$limit;
//echo "query=>".$query."<br>";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
while($rs = $result->fetch_object()){
$rsc[]=$rs;
}
//전체게시물 수 구하기
$sqlcnt = "select count(*) as cnt from board where 1=1";
$sqlcnt .= " and status=1";
$sqlcnt .= $search_where;
$countresult = $mysqli->query($sqlcnt) or die("query error => ".$mysqli->error);
$rscnt = $countresult->fetch_object();
$totalCount = $rscnt->cnt;//전체 게시물 갯수를 구한다.
$totalPage = ceil($totalCount/$pageCount);//전체 페이지를 구한다.
if($firstPageNumber < 1) $firstPageNumber = 1;
$lastPageNumber = $firstPageNumber + $pageCount - 1;//페이징 나오는 부분에서 레인지를 정한다.
if($lastPageNumber > $totalPage) $lastPageNumber = $totalPage;
if($firstPageNumber > $totalPage) {
echo "<script>alert('더 이상 페이지가 없습니다.');history.back();</script>";
exit;
}
?>
<!-- 더보기 버튼을 클릭하면 다음 페이지를 넘겨주기 위해 현재 페이지에 1을 더한 값을 준비한다. 더보기를 클릭할때마다 1씩 더해준다. -->
<input type="hidden" name="nextPageNumber" id="nextPageNumber" value="<?php echo $pageNumber+1;?>">
<table class="table">
<thead>
<tr>
<th scope="col">번호</th>
<th scope="col">글쓴이</th>
<th scope="col">제목</th>
<th scope="col">등록일</th>
</tr>
</thead>
<tbody id="board_list">
<?php
$idNumber = $totalCount - ($pageNumber-1)*$pageCount;
foreach($rsc as $r){
//검색어만 하이라이트 해준다.
$subject = str_replace($search_keyword,"<span style='color:red;'>".$search_keyword."</
span>",$r->subject);
?>
<tr>
<th scope="row"><?php echo $idNumber--;?></th>
<td><?php echo $r->userid?></td>
<td>
<?php
if($r->parent_id){
echo " ";
}
?>
<a href="/view.php?bid=<?php echo $r->bid;?>"><?php echo $subject?></a>
<?php if($r->newid){?>
<span class="badge bg-danger">New</span>
<?php }?>
</td>
<td><?php echo $r->regdate?></td>
</tr>
<?php }?>
</tbody>
</table>
<div class="d-grid gap-2" style="margin:20px;">
<button class="btn btn-secondary" type="button" id="more_button">더보기</button>
</div>
<form method="get" action="<?php echo $_SERVER["PHP_SELF"]?>">
<div class="input-group mb-12" style="margin:auto;width:50%;">
<input type="text" class="form-control" name="search_keyword" id="search_keyword" placeholder="제목과 내용에서 검색합니다." value="<?php echo $search_keyword;?>" aria-label="Recipient's username" aria-describedby="button-addon2">
<button class="btn btn-outline-secondary" type="button" id="search">검색</button>
</div>
</form>
<!-- <p>
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
<li class="page-item">
<a class="page-link" href="<?php echo $_SERVER['PHP_SELF']?>?pageNumber=<?php echo $firstPageNumber-$pageCount;?>&firstPageNumber=<?php echo $firstPageNumber-$pageCount;?>&search_keyword=<?php echo $search_keyword;?>">Previous</a>
</li>
<?php
for($i=$firstPageNumber;$i<=$lastPageNumber;$i++){
?>
<li class="page-item <?php if($pageNumber==$i){echo "active";}?>"><a class="page-link" href="<?php echo $_SERVER['PHP_SELF']?>?pageNumber=<?php echo $i;?>&firstPageNumber=<?php echo $firstPageNumber;?>&search_keyword=<?php echo $search_keyword;?>"><?php echo $i;?></a></li>
<?php
}
?>
<li class="page-item">
<a class="page-link" href="<?php echo $_SERVER['PHP_SELF']?>?pageNumber=<?php echo $firstPageNumber+$pageCount;?>&firstPageNumber=<?php echo $firstPageNumber+$pageCount;?>&search_keyword=<?php echo $search_keyword;?>">Next</a>
</li>
</ul>
</nav>
</p> -->
<p style="text-align:right;">
<?php
if($_SESSION['UID']){
?>
<a href="write.php"><button type="button" class="btn btn-primary">등록</button><a>
<a href="/member/logout.php"><button type="button" class="btn btn-primary">로그아웃</button><a>
<?php
}else{
?>
<a href="/member/login.php"><button type="button" class="btn btn-primary">로그인</button><a>
<a href="/member/signup.php"><button type="button" class="btn btn-primary">회원가입</button><a>
<?php
}
?>
</p>
<script>
$("#more_button").click(function () {
var data = {//more_list_page.php에 넘겨주는 파라미터 값이다.
pageNumber : $('#nextPageNumber').val() ,
pageCount : <?php echo $pageCount;?>,
totalCount : <?php echo $totalCount;?>,
search_keyword : <?php echo $search_keyword;?>
};
$.ajax({
async : false ,
type : 'post' ,//post방식으로 넘겨준다. ajax는 반드시 post로 해준다.
url : 'more_list_page.php' ,
data : data ,//위에서 만든 파라미터들을 넘겨준다.
dataType : 'html' ,//리턴받을 형식이다. html말고 text난 json도 있다. json을 가장 많이 쓴다.
error : function() {} ,
success : function(return_data) {
if(return_data==false){
alert('마지막 페이지입니다.');
return;
}else{
$("#board_list").append(return_data);//table 마지막에 붙여준다. 반대는 prepend가 있다.
$("#nextPageNumber").val(parseInt($('#nextPageNumber').val())+1);//다음페이지를 위해 1씩 증가해준다.
}
}
});
});
</script>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>
물론 php부분에서 날짜를 계산해도 된다. 그건 각자의 마음이지만 이번엔 이렇게 해봤다.
다음에는 댓글이 달린 갯수를 표시해보자. 댓글이 있으면 댓글 수를 표시하고 없으면 표시하지 않는다. 댓글이 24시간안에 달렸으면 색깔을 구분해보겠다.
우선 쿼리를 수정한다.
select b.*, if((now() - regdate)<=86400,1,0) as newid
,(select count(*) from memo m where m.status=1 and m.bid=b.bid) as memocnt
,(select m.regdate from memo m where m.status=1 and m.bid=b.bid order by m.memoid desc limit 1) as memodate
from board b
기존 쿼리에 서브쿼리를 이용해 댓글의 갯수와 마지막 댓글의 시간을 가져오는 쿼리를 추가했다. 전체 소스는 아래와 같다.
/index.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";
$search_keyword = $_GET['search_keyword'];
if($search_keyword){
$search_where = " and (subject like '%".$search_keyword."%' or content like '%".$search_keyword."%')";
}
$pageNumber = $_GET['pageNumber']??1;//현재 페이지, 없으면 1
if($pageNumber < 1) $pageNumber = 1;
$pageCount = $_GET['pageCount']??10;//페이지당 몇개씩 보여줄지, 없으면 10
$startLimit = ($pageNumber-1)*$pageCount;//쿼리의 limit 시작 부분
$firstPageNumber = $_GET['firstPageNumber'];
$sql = "select b.*, if((now() - regdate)<=86400,1,0) as newid
,(select count(*) from memo m where m.status=1 and m.bid=b.bid) as memocnt
,(select m.regdate from memo m where m.status=1 and m.bid=b.bid order by m.memoid desc limit 1) as memodate
from board b where 1=1";
$sql .= " and status=1";
$sql .= $search_where;
$order = " order by ifnull(parent_id, bid) desc, bid asc";
$limit = " limit $startLimit, $pageCount";
$query = $sql.$order.$limit;
//echo "query=>".$query."<br>";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
while($rs = $result->fetch_object()){
$rsc[]=$rs;
}
//전체게시물 수 구하기
$sqlcnt = "select count(*) as cnt from board where 1=1";
$sqlcnt .= " and status=1";
$sqlcnt .= $search_where;
$countresult = $mysqli->query($sqlcnt) or die("query error => ".$mysqli->error);
$rscnt = $countresult->fetch_object();
$totalCount = $rscnt->cnt;//전체 게시물 갯수를 구한다.
$totalPage = ceil($totalCount/$pageCount);//전체 페이지를 구한다.
if($firstPageNumber < 1) $firstPageNumber = 1;
$lastPageNumber = $firstPageNumber + $pageCount - 1;//페이징 나오는 부분에서 레인지를 정한다.
if($lastPageNumber > $totalPage) $lastPageNumber = $totalPage;
if($firstPageNumber > $totalPage) {
echo "<script>alert('더 이상 페이지가 없습니다.');history.back();</script>";
exit;
}
?>
<!-- 더보기 버튼을 클릭하면 다음 페이지를 넘겨주기 위해 현재 페이지에 1을 더한 값을 준비한다. 더보기를 클릭할때마다 1씩 더해준다. -->
<input type="hidden" name="nextPageNumber" id="nextPageNumber" value="<?php echo $pageNumber+1;?>">
<table class="table">
<thead>
<tr>
<th scope="col">번호</th>
<th scope="col">글쓴이</th>
<th scope="col">제목</th>
<th scope="col">등록일</th>
</tr>
</thead>
<tbody id="board_list">
<?php
$idNumber = $totalCount - ($pageNumber-1)*$pageCount;
foreach($rsc as $r){
//검색어만 하이라이트 해준다.
$subject = str_replace($search_keyword,"<span style='color:red;'>".$search_keyword."</
span>",$r->subject);
?>
<tr>
<th scope="row"><?php echo $idNumber--;?></th>
<td><?php echo $r->userid?></td>
<td>
<?php
if($r->parent_id){
echo " ";
}
?>
<a href="/view.php?bid=<?php echo $r->bid;?>"><?php echo $subject?></a>
<?php if($r->memocnt){?>
<span <?php if((time()-strtotime($r->memodate))<=86400){ echo "style='color:red;'";}?>>
[<?php echo $r->memocnt;?>]
</span>
<?php }?>
<?php if($r->newid){?>
<span class="badge bg-danger">New</span>
<?php }?>
</td>
<td><?php echo $r->regdate?></td>
</tr>
<?php }?>
</tbody>
</table>
<div class="d-grid gap-2" style="margin:20px;">
<button class="btn btn-secondary" type="button" id="more_button">더보기</button>
</div>
<form method="get" action="<?php echo $_SERVER["PHP_SELF"]?>">
<div class="input-group mb-12" style="margin:auto;width:50%;">
<input type="text" class="form-control" name="search_keyword" id="search_keyword" placeholder="제목과 내용에서 검색합니다." value="<?php echo $search_keyword;?>" aria-label="Recipient's username" aria-describedby="button-addon2">
<button class="btn btn-outline-secondary" type="button" id="search">검색</button>
</div>
</form>
<!-- <p>
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
<li class="page-item">
<a class="page-link" href="<?php echo $_SERVER['PHP_SELF']?>?pageNumber=<?php echo $firstPageNumber-$pageCount;?>&firstPageNumber=<?php echo $firstPageNumber-$pageCount;?>&search_keyword=<?php echo $search_keyword;?>">Previous</a>
</li>
<?php
for($i=$firstPageNumber;$i<=$lastPageNumber;$i++){
?>
<li class="page-item <?php if($pageNumber==$i){echo "active";}?>"><a class="page-link" href="<?php echo $_SERVER['PHP_SELF']?>?pageNumber=<?php echo $i;?>&firstPageNumber=<?php echo $firstPageNumber;?>&search_keyword=<?php echo $search_keyword;?>"><?php echo $i;?></a></li>
<?php
}
?>
<li class="page-item">
<a class="page-link" href="<?php echo $_SERVER['PHP_SELF']?>?pageNumber=<?php echo $firstPageNumber+$pageCount;?>&firstPageNumber=<?php echo $firstPageNumber+$pageCount;?>&search_keyword=<?php echo $search_keyword;?>">Next</a>
</li>
</ul>
</nav>
</p> -->
<p style="text-align:right;">
<?php
if($_SESSION['UID']){
?>
<a href="write.php"><button type="button" class="btn btn-primary">등록</button><a>
<a href="/member/logout.php"><button type="button" class="btn btn-primary">로그아웃</button><a>
<?php
}else{
?>
<a href="/member/login.php"><button type="button" class="btn btn-primary">로그인</button><a>
<a href="/member/signup.php"><button type="button" class="btn btn-primary">회원가입</button><a>
<?php
}
?>
</p>
<script>
$("#more_button").click(function () {
var data = {//more_list_page.php에 넘겨주는 파라미터 값이다.
pageNumber : $('#nextPageNumber').val() ,
pageCount : <?php echo $pageCount;?>,
totalCount : <?php echo $totalCount;?>,
search_keyword : <?php echo $search_keyword;?>
};
$.ajax({
async : false ,
type : 'post' ,//post방식으로 넘겨준다. ajax는 반드시 post로 해준다.
url : 'more_list_page.php' ,
data : data ,//위에서 만든 파라미터들을 넘겨준다.
dataType : 'html' ,//리턴받을 형식이다. html말고 text난 json도 있다. json을 가장 많이 쓴다.
error : function() {} ,
success : function(return_data) {
if(return_data==false){
alert('마지막 페이지입니다.');
return;
}else{
$("#board_list").append(return_data);//table 마지막에 붙여준다. 반대는 prepend가 있다.
$("#nextPageNumber").val(parseInt($('#nextPageNumber').val())+1);//다음페이지를 위해 1씩 증가해준다.
}
}
});
});
</script>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>
이번엔 24시간을 비교할때 php 부분에서 처리를 했다. 속도는 큰 차이 없을 것 같다.
개발하다 힘들면 눌러.
반응형
'PHP강좌 > 게시판만들기강좌' 카테고리의 다른 글
php+mysql 게시판 만들기 강좌 #22. 회원 게시판 - 다중 파일 첨부 multiple 와 뷰화면에 보여주기 (0) | 2022.02.09 |
---|---|
php+mysql 게시판 만들기 강좌 #21. 회원 게시판 - 파일 첨부, 파일 등록 (5) | 2022.02.09 |
php+mysql 게시판 만들기 강좌 #19. 회원 게시판 - 추천, 반대 (0) | 2022.02.09 |
php+mysql 게시판 만들기 강좌 #18-1. 회원 게시판 - 댓글의 수정및 삭제 (7) | 2022.02.07 |
php+mysql 게시판 만들기 강좌 #18. 회원 게시판 - 댓글 (0) | 2022.02.04 |