※ 예전에 회원관리에서 사용했었던 방식을 그대로 가져오면서 수정되는 부분만 추가, 삭제하였습니다.

먼저 해당 게시판의 글 목록을 가져오는 부분을 해보겠습니다.
// 글 목록
public function list($bcode, $page, $limit, $paramArr)
{
$start = ($page - 1) * $limit;
$where = "WHERE bcode=:bcode";
if (isset($paramArr["sn"]) && $paramArr["sn"] != "" && isset($paramArr["sf"]) && $paramArr["sf"] != "") {
switch ($paramArr["sn"]) {
case 1:
$sn_str = "name";
break;
case 2:
$sn_str = "id";
break;
case 3:
$sn_str = "email";
break;
}
$where .= " " . $sn_str . "=:sf";
}
$sql = "SELECT idx, id, name, subject, hit, DATE_FORMAT(create_at,'%Y-%m-%d %H-%i') AS create_at
FROM board " . $where . "
ORDER BY idx DESC LIMIT " . $start . "," . $limit;
$stmt = $this->conn->prepare($sql);
$stmt->bindParam(":bcode", $bcode);
if (isset($paramArr["sf"]) && $paramArr["sf"] != "") {
$stmt->bindParam(":sf", $paramArr["sf"]);
}
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();
return $stmt->fetchAll();
}
현재 필자는 Board 클래스를 만들어서 해당 클래스에 맞는 작업들을 진행하고 있습니다. 크게 달라지는 부분은 없고 파라미터 값 bcode를 추가해 주고 해당 게시물의 글 목록을 가져오기 위해서 WHERE 문에 bcode를 추가해 주고 쿼리 문에 가져올 필드 subject, hit 정도 추가해 주었습니다.
<?php
function my_pagination($total, $limit, $page_limit, $page, $param)
{
$total_page = ceil($total / $limit); // 107 / 5 = 21.4 == 22
$start_page = ((floor(($page - 1) / $page_limit)) * $page_limit) + 1; // 1
$end_page = $start_page + $page_limit - 1; // 1 + 5 -1 = 5
if ($end_page > $total_page) {
$end_page = $total_page;
}
$prev_page = $start_page - 1; // 0
$rs_str = '<nav>
<ul class="pagination">';
$rs_str .= '<li class="page-item"><a class="page-link" href="' . $_SERVER['PHP_SELF'] . '?page=1' . $param . '">First</a></li>';
if ($prev_page > 1) {
$rs_str .= '<li class="page-item"><a class="page-link" href="' . $_SERVER['PHP_SELF'] . '?page=' . $prev_page . $param . '">Prev</a></li>';
}
for ($i = $start_page; $i <= $end_page; $i++) {
if ($i == $page) {
$rs_str .= "<li class=\"page-item active\"><a class=\"page-link\" href=\"#\">{$i}</a></li>";
} else {
$rs_str .= '<li class="page-item"><a class="page-link" href="' . $_SERVER['PHP_SELF'] . "?page={$i}{$param}\">{$i}</a></li>";
}
}
$next_page = $end_page + 1;
if ($next_page <= $total_page) {
$rs_str .= '<li class="page-item"><a class="page-link" href="' . $_SERVER['PHP_SELF'] . "?page={$next_page}{$param}\">Next</a></li>";
}
if ($page < $total_page) {
$rs_str .= '<li class="page-item"><a class="page-link" href="' . $_SERVER['PHP_SELF'] . "?page={$total_page}{$param}\">Last</a></li>";
}
$rs_str .= '</ul></nav>';
return $rs_str;
}
// 게시판 전체 글 수 구하기
public function total($bcode, $paramArr)
{
$where = "WHERE bcode=:bcode ";
if (isset($paramArr["sn"]) && $paramArr["sn"] != "" && isset($paramArr["sf"]) && $paramArr["sf"] != "") {
switch ($paramArr["sn"]) {
case 1:
$sn_str = "name";
break;
case 2:
$sn_str = "id";
break;
case 3:
$sn_str = "email";
break;
}
$where .= "AND " . $sn_str . "=:sf ";
}
$sql = "SELECT COUNT(*) cnt FROM board " . $where;
$stmt = $this->conn->prepare($sql);
$stmt->bindParam(":bcode", $bcode);
if (isset($paramArr["sf"]) && $paramArr["sf"] != "") {
$stmt->bindParam(":sf", $paramArr["sf"]);
}
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();
$row = $stmt->fetch();
return $row["cnt"];
}
해당하는 게시글의 총개수를 구해줍니다. 페이지 네이션에서 사용할 값입니다.

<?php
include "inc/common.php"; // 세션
include "inc/dbconfig.php";
include "inc/board.php"; // 게시판 클래스
include "inc/lib.php"; // 페에지네이션
$bcode = isset($_GET["bcode"]) && $_GET["bcode"] != "" ? $_GET["bcode"] : "";
$page = (isset($_GET["page"]) && $_GET["page"] != "" && is_numeric($_GET["page"])) ? $_GET["page"] : 1;
if ($bcode == "") {
die('
<script>
alert("게시판 코드가 누락되었습니다.")
history.back()
</script>');
}
// 게시판 목록 불러오기
include "inc/boardmanage.php";
$boardm = new BoardManage($db);
$boardArr = $boardm->list();
$board_name = $boardm->getBoardName($bcode);
$board = new Board($db);
$js_array = ['js/board.js'];
$g_title = $board_name;
$menu_code = "board";
$paramArr = [];
$total = $board->total($bcode, $paramArr);
$limit = 10;
$page_limit = 10;
$boardRs = $board->list($bcode, $page, $limit, $paramArr);
include "inc_header.php";
?>
<main class="w-75 mx-auto border rounded-2 p-5">
<h1 class="text-center"><?= $board_name; ?></h1>
<table class="table table-striped">
<tr>
<th>번호</th>
<th>제목</th>
<th>이름</th>
<th>날짜</th>
<th>조회 수</th>
</tr>
<?php
foreach ($boardRs as $boardRow) {
?>
<tr>
<td><?= $boardRow["idx"]; ?></td>
<td><?= $boardRow["subject"]; ?></td>
<td><?= $boardRow["name"]; ?></td>
<td><?= $boardRow["create_at"]; ?></td>
<td><?= $boardRow["hit"]; ?></td>
</tr>
<?php
}
?>
</table>
<div class="d-flex justify-content-between align-items-start">
<?php
$param = "&bcode=" . $bcode;
if (isset($sn) && $sn != "" && isset($sf) && $sf != "") {
$param = "&sn=" . $sn . "&sf=" . $sf;
}
echo my_pagination($total, $limit, $page_limit, $page, $param);
?>
<button class="btn btn-primary" id="btn_write">글쓰기</button>
</div>
</main>
<?php
include "inc_footer.php";
?>
간단하게 요약을 하자면
1. 게시글 목록을 가져오기 위해서 Board 클래스의 인스턴스를 만들어줍니다. 가져온 Board 클래스를 가지고 toal 함수와 list 함수를 가져와 게시글에 해당하는 글을 가져옵니다. foreach 반복문을 사용하여 가져온 값들을 출력합니다.
2. 페이지 네이션에서 필요한 파라미터를 가져와 화면에 출력합니다. 페이지 이동을 할 때 게시판 코드를 가지고 이동을 하는데 페이지 네이션은 공용으로 사용하는 부분이라서 수정하기보다는 param 값에 추가로 게시판 코드를 추가하여 주었습니다.
다음 시간에는 검색 기능과 게시물 번호 재지정을 해보겠습니다.
감사합니다.