php 게시판 수정하기
php를 이용하여 만든 게시판에서 생긴 오류들이나 추가해야할 기능을 더 넣어 수정 하였습니다.
게시판
<?php
include "../connect/connect.php";
include "../connect/session.php";
// 게시글 총 갯수
$sql = "SELECT count(boardID) FROM board";
$result = $connect -> query($sql);
$boardTotalCount = $result -> fetch_array(MYSQLI_ASSOC);
$boardTotalCount = $boardTotalCount['count(boardID)'];
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판</title>
<?php include "../include/head.php" ?>
</head>
<body class="gray">
<?php include "../include/skip.php" ?>
<!-- //skip -->
<?php include "../include/header.php" ?>
<!-- //header -->
<main id="main" class="container">
<div class="intro__inner center bmStyle">
<picture class="intro__images small">
<source srcset="../assets/img/join01.png, ../assets/img/join01@2x.png 2x, ../assets/img/join01@3x.png 3x" />
<img src="../assets/img/join01.png" alt="회원가입 이미지">
</picture>
<h2>게시판</h2>
<p class="intro__text">
웹디자이너, 웹 퍼블리셔, 프론트엔드 개발자를 위한 게시판입니다.<br>
관련된 문의사항은 여기서 확인하세요!
</p>
</div>
<!-- intro__inner -->
<div class="board__inner">
<div class="board__search">
<div class="left">
* 총 <em><?=$boardTotalCount?></em>건의 게시물이 등록되어 있습니다.
</div>
<div class="right">
<form action="boardSearch.php" name="boardSearch" method="get">
<fieldset>
<legend class="blind">게시판 검색 영역</legend>
<input type="search" name="searchKeyword" id="searchKeyword" placeholder="검색어를 입력하세요!" required>
<select name="searchOption" id="searchOption">
<option value="title">제목</option>
<option value="content">내용</option>
<option value="name">등록자</option>
</select>
<button type="submit" class="btnStyle3 white">검색</button>
<a href="boardWrite.php" class="btnStyle3">글쓰기</a>
</fieldset>
</form>
</div>
</div>
<div class="board__table">
<table>
<colgroup>
<col style="width: 5%">
<col>
<col style="width: 10%">
<col style="width: 15%">
<col style="width: 7%">
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>등록자</th>
<th>등록일</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<!-- <tr>
<td>1</td>
<td><a href="boardView.html"><a href="boardView.html">게시판 제목</a></a></td>
<td>김도현</td>
<td>2022-02-02</td>
<td>100</td>
</tr> -->
<?php
if(isset($_GET['page'])){
$page = (int) $_GET['page'];
} else {
$page = 1;
}
$viewNum = 10;
$viewLimit = ($viewNum * $page) - $viewNum;
// 1~20 DESC LIMIT 0, 20 --> page1 (viewNum * 1) - viewNum
// 21~40 DESC LIMIT 20, 20 --> page2 (viewNum * 2) - viewNum
// 41~60 DESC LIMIT 40, 20 --> page3 (viewNum * 3) - viewNum
// 61~80 DESC LIMIT 60, 20 --> page4 (viewNum * 4) - viewNum
$sql = "SELECT b.boardID, b.boardTitle, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) ORDER BY boardID DESC LIMIT {$viewLimit}, {$viewNum}";
$result = $connect -> query($sql);
if($result){
$count = $result -> num_rows;
if($count > 0){
for($i=0; $i<$count; $i++){
$info = $result -> fetch_array(MYSQLI_ASSOC);
echo "<tr>";
echo "<td>".$info['boardID']."</td>";
echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</a></td>";
echo "<td>".$info['youName']."</td>";
echo "<td>".date('Y-m-d', $info['regTime'])."</td>";
echo "<td>".$info['boardView']."</td>";
echo "</tr>";
}
}
}
?>
</tbody>
</table>
</div>
<div class="board__pages">
<ul>
<?php
// 총 페이지 갯수
$boardTotalCount = ceil($boardTotalCount/$viewNum);
$pageView = 5;
$startPage = $page - $pageView;
$endPage = $page + $pageView;
// 처음 페이지 초기화
if($startPage < 1) $startPage = 1;
// 마지막 페이지 초기화
if($endPage >= $boardTotalCount) $endPage = $boardTotalCount;
// 처음으로/이전
if($page != 1 && $page <= $boardTotalCount){
$prevPage = $page - 1;
echo "<li><a href='board.php?page=1'>처음으로</a></li>";
echo "<li><a href='board.php?page={$prevPage}'>이전</a></li>";
}
//페이지
for($i=$startPage; $i<=$endPage; $i++){
$active = "";
if($page <= $boardTotalCount){
if($i == $page) $active = 'active';
echo "<li class='{$active}'><a href='board.php?page={$i}'>{$i}</a></li>";
}
}
// 마지막으로/다음
if($page != $boardTotalCount && $page <= $boardTotalCount){
$nextPage = $page + 1;
echo "<li><a href='board.php?page={$nextPage}'>다음</a></li>";
echo "<li><a href='board.php?page={$boardTotalCount}'>마지막으로</a></li>";
}
?>
<!-- <li><a href="#">처음으로</a></li>
<li><a href="#">이전</a></li>
<li class="active"><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li><a href="#">6</a></li>
<li><a href="#">7</a></li>
<li><a href="#">다음</a></li>
<li><a href="#">마지막으로</a></li> -->
</ul>
</div>
</div>
</main>
<!-- //main -->
<?php include "../include/footer.php" ?>
<!-- //footer -->
</body>
</html>
<?php
$searchKeyword = $_GET['searchKeyword'];
$searchOption = $_GET['searchOption'];
$searchKeyword = $connect -> real_escape_string(trim($searchKeyword));
$searchOption = $connect -> real_escape_string(trim($searchOption));
?>
<p class="intro__text">
웹 디자이너, 웹 퍼블리셔, 프론트앤드 개발자를 위한 게시판입니다.<br>
총 <em><?=$totalCount?></em>건의 게시물이 검색되었습니다.
</p>
총 게시물의 갯수를 보여주는 코드입니다.
게시판 검색결과
<?php
include "../connect/connect.php";
include "../connect/session.php";
if(isset($_GET['page'])){
$page = (int) $_GET['page'];
} else {
$page = 1;
}
$searchKeyword = $_GET['searchKeyword'];
$searchOption = $_GET['searchOption'];
$searchKeyword = $connect -> real_escape_string(trim($searchKeyword));
$searchOption = $connect -> real_escape_string(trim($searchOption));
$sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) ";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE b.boardTitle LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE b.boardContents LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE m.youName LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";
switch($searchOption){
case "title":
$sql .= "WHERE b.boardTitle LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
break;
case "content":
$sql .= "WHERE b.boardContents LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
break;
case "name":
$sql .= "WHERE m.youName LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
break;
}
$result = $connect -> query($sql);
$totalCount = $result -> num_rows;
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판</title>
<?php include "../include/head.php" ?>
</head>
<body class="gray">
<?php include "../include/skip.php" ?>
<!-- //skip -->
<?php include "../include/header.php" ?>
<!-- //header -->
<main id="main" class="container">
<div class="intro__inner center">
<picture class="intro__images small">
<source srcset="../assets/img/joinEnd01.png, ../assets/img/joinEnd01@2x.png 2x, ../assets/img/joinEnd01@3x.png 3x"/>
<img src="../assets/img/joinEnd01.png" alt="게시판이미지">
</picture>
<h2>결과 게시판</h2>
<p class="intro__text">
웹 디자이너, 웹 퍼블리셔, 프론트앤드 개발자를 위한 게시판입니다.<br>
총 <em><?=$totalCount?></em>건의 게시물이 검색되었습니다.
</p>
</div>
<div class="board__inner">
<div class="board__table">
<table>
<colgroup>
<col style="width: 5%">
<col>
<col style="width: 10%">
<col style="width: 15%">
<col style="width: 7%">
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>등록자</th>
<th>등록일</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<?php
$viewNum = 20;
$viewLimit = ($viewNum * $page) - $viewNum;
$sql .= "LIMIT {$viewLimit}, {$viewNum}";
$result = $connect -> query($sql);
if($result){
$count = $result -> num_rows;
if($count >0){
for($i=0; $i<$count; $i++){
$info = $result -> fetch_array(MYSQLI_ASSOC);
echo "<tr>";
echo "<td>".$info['boardID']."</td>";
echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</a></td>";
echo "<td>".$info['youName']."</td>";
echo "<td>".date('Y-m-d', $info['regTime'])."</td>";
echo "<td>".$info['boardView']."</td>";
echo "</tr>";
}
} else {
echo "<tr><td colspan='5'>게시글이 없습니다.</td></tr>";
}
}
?>
<!-- <tr>
<td>1</td>
<td><a href="boardView.html">게시판 제목</a></td>
<td>이름</td>
<td>2022-02-02</td>
<td>100</td>
</tr> -->
</tbody>
</table>
</div>
<div class="board__pages">
<ul>
<!-- <li><a href="#">처음으로</a></li>
<li><a href="#">이전</a></li>
<li class="active"><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li><a href="#">6</a></li>
<li><a href="#">7</a></li>
<li><a href="#">다음</a></li>
<li><a href="#">마지막으로</a></li> -->
<?php
// 총 페이지 갯수
$boardTotalCount = ceil($totalCount/$viewNum);
// 1 2 3 4 5 [6] 7 8 9 10 11
$pageView = 4;
$startPage = $page - $pageView;
$endPage = $page + $pageView;
//처음/마지막 페이지 초기화
if($startPage < 1) $startPage = 1;
if($endPage >= $boardTotalCount) $endPage = $boardTotalCount;
// 처음으로/이전
if($page != 1 && $page <= $boardTotalCount){
$prevPage = $page - 1;
echo "<li><a href='boardSearch.php?page=1&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>처음으로</a></li>";
echo "<li><a href='boardSearch.php?page={$prevPage}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>이전</a></li>";
}
//페이지
for($i=$startPage; $i<=$endPage; $i++){
$active = "";
if($page <= $boardTotalCount){
if($i == $page) $active = 'active';
echo "<li class='{$active}'><a href='boardSearch.php?page={$i}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>{$i}</a></li>";
}
}
// 마지막으로/다음
if($page != $boardTotalCount && $page <= $boardTotalCount){
$nextPage = $page + 1;
echo "<li><a href='boardSearch.php?page={$nextPage}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>다음</a></li>";
echo "<li><a href='boardSearch.php?page={$boardTotalCount}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>마지막으로</a></li>";
}
?>
</ul>
</div>
</div>
</div>
<!-- intro__inner -->
</main>
<?php include "../include/footer.php" ?>
<!-- //footer -->
</body>
</html>
검색창에 검색 내용을 입력하고 검색 버튼을 누릅니다.
아래의 다음페이지 부분들을 누르면 위 링크가 다시 게시판 메인 페이지(board.php)로 돌아가는 오류가 있었습니다.
위 사진을 보시면 검색한 키워드에 따라서 다음페이지를 눌렀을때 키워드가 사라지지 않고 유지되어 있는 모습입니다.
<?php
// 총 페이지 갯수
$boardTotalCount = ceil($totalCount/$viewNum);
// 1 2 3 4 5 [6] 7 8 9 10 11
$pageView = 4;
$startPage = $page - $pageView;
$endPage = $page + $pageView;
//처음/마지막 페이지 초기화
if($startPage < 1) $startPage = 1;
if($endPage >= $boardTotalCount) $endPage = $boardTotalCount;
// 처음으로/이전
if($page != 1 && $page <= $boardTotalCount){
$prevPage = $page - 1;
echo "<li><a href='boardSearch.php?page=1&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>처음으로</a></li>";
echo "<li><a href='boardSearch.php?page={$prevPage}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>이전</a></li>";
}
//페이지
for($i=$startPage; $i<=$endPage; $i++){
$active = "";
if($page <= $boardTotalCount){
if($i == $page) $active = 'active';
echo "<li class='{$active}'><a href='boardSearch.php?page={$i}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>{$i}</a></li>";
}
}
// 마지막으로/다음
if($page != $boardTotalCount && $page <= $boardTotalCount){
$nextPage = $page + 1;
echo "<li><a href='boardSearch.php?page={$nextPage}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>다음</a></li>";
echo "<li><a href='boardSearch.php?page={$boardTotalCount}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>마지막으로</a></li>";
}
?>
코드 설명
먼저, $boardTotalCount 변수에는 전체 게시글 수를 한 페이지에 보여지는 게시글 수 $viewNum 으로 나눈 값을 올림한 값으로 총 페이지 수를 구합니다.
그리고, $pageView 변수에는 현재 페이지를 중심으로 양 옆에 몇 개의 페이지를 보여줄 것인지를 정합니다. 이 예제에서는 4로 설정되어 있습니다.
그 다음으로 $startPage와 $endPage 변수를 이용하여 페이지 목록의 시작 페이지와 끝 페이지를 계산합니다. 이 때, 시작 페이지는 현재 페이지에서 $pageView 만큼 빼고, 끝 페이지는 현재 페이지에서 $pageView 만큼 더한 값을 사용합니다. 하지만, 시작 페이지가 1보다 작아지면 1로, 끝 페이지가 총 페이지 수보다 크면 총 페이지 수로 초기화합니다.
이제 for 반복문을 이용하여 페이지 목록을 생성합니다. startPage 부터 endPage 까지의 페이지 번호를 출력하며, 현재 페이지 번호와 같은 경우 'active' 클래스를 추가하여 스타일을 변경합니다.
마지막으로, 현재 페이지가 1이 아니고 총 페이지 수보다 작거나 같은 경우에는 '처음으로'와 '이전' 링크를 출력하고, 현재 페이지가 총 페이지 수가 아니고 총 페이지 수보다 작거나 같은 경우에는 '다음'과 '마지막으로' 링크를 출력합니다. 링크는 $page, $searchKeyword, $searchOption 변수를 이용하여 현재 페이지 번호와 검색어, 검색 조건 등을 전달합니다.