
<?php
$g_title = "해커들의 놀이터";
$js_array = ["../js/home.js"];
$menu_code = "member";
include "inc_common.php";
include "inc_header.php";
include "../inc/dbconfig.php";
include "../inc/member.php"; // 회원관리 Class
include "../inc/lib.php"; // 페이지네이션
// $total, $limit, $page_limit, $page, $param
$mem = new Member($db);
$total = $mem->total();
$limit = 5;
$page_limit = 5;
$page = (isset($_GET["page"]) && $_GET["page"] != "" && is_numeric($_GET["page"])) ? $_GET["page"] : 1;
$param = "";
$memArr = $mem->list($page, $limit);
?>
<main class="w-75 mx-auto border rounded-5 p-5 " style="height: calc(100vh - 265px);">
<div class="container">
<h3 class="">회원관리</h3>
</div>
<table class="table table-border">
<tr>
<th>번호</th>
<th>아이디</th>
<th>이름</th>
<th>이메일</th>
<th>등록일시</th>
<th>관리</th>
</tr>
<?php
foreach ($memArr as $row) {
// 2025-07-23 22-35
// $row["create_at"] = substr($row["create_at"], 0, 16);
?>
<tr>
<td><?= $row["idx"]; ?></td>
<td><?= $row["id"]; ?></td>
<td><?= $row["name"]; ?></td>
<td><?= $row["email"]; ?></td>
<td><?= $row["create_at"]; ?></td>
<td>
<button class="btn btn-primary btn-sm">수정</button>
<button class="btn btn-danger btn-sm">삭제</button>
</td>
</tr>
<?php
}
?>
</table>
<?php
echo my_pagination($total, $limit, $page_limit, $page, $param);
?>
</main>
<?php
include "inc_footer.php";
?>

$row["create_at"] = substr($row["create_at"], 0, 16);
// DB 정보 리스트
public function list($page, $limit)
{
$start = ($page - 1) * $limit;
$sql = "SELECT idx, id, name, email, DATE_FORMAT(create_at,'%Y-%m-%d %H-%i') AS create_at FROM member ORDER BY idx DESC LIMIT " . $start . "," . $limit;
$stmt = $this->conn->prepare($sql);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();
return $stmt->fetchAll();
}

<?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
if ($prev_page < 1) { // 1
$prev_page = 1;
}
$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;
}
이제 간단히 설명을 해보자면
total : 전체 페이지 수
limit : 해당 페이지에 보일 개수
ex) 5개로 제한하면 5개의 데이터가 나타납니다.

page_limit : 페이지 네이션 개수 제한
ex) 3개로 제한하면 3개만 나타납니다.

page : 현재 페이지의 위치(주소)
ex) 현재 페이지가 page=6이라면 해당 페이지로 이동


param : 지금은 사용하지 않지만 추후에 검색 기능에 사용될 기능입니다.
ex) 네이버 검색 시 해당 키워드로 검색

$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
total_page에 ceil(total / limit)를 사용하여 총 페이지 수를 구합니다. ceil 함수는 올림 한 수입니다.
필자는 총 107개의 데이터를 가지고 있으므로 107 / 5 = 21.4 == 22 계산 값이 나왔습니다.
start_page에 ((floor((page - 1) / page_limit)) * page_limit) + 1을 하여 시작페이지를 구했습니다.
floor()는 내림함 수입니다. 시작페이지는 현재 페이지에서 -1을 해주고 그 값과 페이지 제한 값으로 나누어줍니다. 이렇게 해야 처음 페이지에서 1,2,3,4,5 페이지까지는 값이 1이기 때문에 이 값을 가지고 1,2,3 페이지를 구분해 줄 수 있습니다.
end_page에 시작페이지와 페이지 제한 값을 더하고 -1을 해줍니다. 예를 들어보겠습니다.
ex) 1번째 화면에서는 1~5까지 페이지 네이션을 보여줘야 하고 그 이후 2번째 화면에서는 6~10까지 있는 페이지 네이션을 보여줘야 합니다. 따라서 1번째 화면에서는 최댓값이 5가 마지막이므로 2번째 화면으로 이동하면 시작페이지 값이 6으로 바뀌어서 마지막 페이지에 대입해 보면 2번째 화면에서는 처음은 6이고 마지막 페이지는 10인 걸 알 수 있습니다.

if ($end_page > $total_page) {
$end_page = $total_page;
}

해당 조건문을 주지 않는다면

$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;
그래도 아쉬우니 설명해 드리겠습니다.

$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>";
}
다음 시간에는 회원관리 검색 기능을 해보겠습니다.
긴 글 봐주셔서 감사합니다.