Leeyanggoo
[PHP] 게시판3 -> 게시판 페이지 설정하기(총 페이지 개수 설정) 본문
총 페이지 개수 구하기
<?php
if(isset($_GET['page'])){
$page = (int) $_GET['page']; // (int)를 적어서 타입(type)을 명시함
} else {
$page = 1;
}
$viewNum = 10; // 한 페이지에 보여줄 개시글 개수
$viewLimit = ($viewNum * $page) - $viewNum;
// 1~20 LIMIT 0, 20 > page1 (viewNum * 1) - viewNum
// 21~40 LIMIT 20, 20 > page2 (viewNum * 2) - viewNum
// 41~60 LIMIT 40, 20
// 61~80 LIMIT 60, 20
$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);
<?php
$sql = "SELECT count(boardID) FROM board";
$result = $connect -> query($sql);
$boardTotalCount = $result -> fetch_array(MYSQLI_ASSOC);
$boardTotalCount = $boardTotalCount['count(boardID)'];
// 총 페이지 개수
$boardTotalCount = ceil($boardTotalCount / $viewNum);
sql 실행문으로 board 테이블에 있는 모든 게시글의 개수를 불러옵니다.
count()의 괄호에는 검색할 열(column) 또는 검색 조건을 나타내는 식(expression)이 들어갑니다.
예제는 boardID의 개수를 불러오고 있으므로 이는 모든 게시글 개수를 의미합니다.
fetch_array() 메서드는 쿼리 결과의 첫 번째 레코드를 배열 형태로 반환합니다.
MYSQLI_ASSOC 옵션은 필드(컬럼) 이름을 키(key)로 사용하여 반환합니다.
따라서 fetch_array(MYSQLI_ASSOC) 메서드를 사용하게 되면, 데이터베이스로부터 레코드를 연관 배열 형태로 가져올 수 있습니다. 이때, 각 필드의 이름이 배열의 키(key)가 되며, 그에 해당하는 값이 배열의 값(value)이 됩니다.
연관 배열은 인덱스가 문자열 또는 숫자로 사용할 수 있는 배열을 말합니다.
따라서 $boardTotalCount는 모든 게시글을 담고 있는 변수가 되었다가, 첫 번째 php 실행문에서 설정한 viewNum에 따라 게시판이 포함하고 있는 페이지 수가 됩니다.
board.php에 출력할 페이지를 LIMIT 조건으로 변경하여 해당 페이지에 맞는 게시글이 나오도록합니다.
페이지 이동 버튼 만들기
<?php
// 게시글이 총 개수?
// 몇 페이지 나옴?
$sql = "SELECT count(boardID) FROM board";
$result = $connect -> query($sql);
$boardTotalCount = $result -> fetch_array(MYSQLI_ASSOC);
$boardTotalCount = $boardTotalCount['count(boardID)'];
// 총 페이지 개수
$boardTotalCount = ceil($boardTotalCount / $viewNum);
// 1 2 3 4 5 [6] 7 8 9 10 11 ... $boardTotalCount 까지 하면 너무 많이 나옴 ㅠㅠ
$pageView = 5; // 그래서 기준 페이지 앞뒤로 만들 페이지 개수 설정함
$startPage = $page - $pageView;
$endPage = $page + $pageView;
// 처음 페이지 + 마지막 페이지 초기화
if($startPage < 1) $startPage = 1;
if($endPage >= $boardTotalCount) $endPage = $boardTotalCount;
// 처음으로 + 이전
if($page != 1){
$prevPage = $page - 1;
echo "<li><a href='board.php?page={$prevPage}'>이전</a></li>";
echo "<li><a href='board.php?page=1'>처음으로</a></li>";
}
// 페이지
for($i=$startPage; $i<=$endPage; $i++){
$active = "";
if($i == $page) $active = "active"; // 보고 있는 페이지가 같으면 active라는 문자열 추가
echo "<li class='{$active}'><a href='board.php?page={$i}'>{$i}</a></li>";
}
// 다음
if($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>";
}
// 게시글이 없을 때?
if($page > $boardTotalCount || $page <= 0){
echo "<script>alert('게시글이 없습니다.');location.href = 'board.php';</script>";
}
?>
총 페이지 개수를 구했다면 사용자에게 해당 페이지로 이동할 수 있는 버튼을 만들 차례입니다.
$pageView는 사용자가 보고 있는 현재 페이지이자 하단 버튼의 active 값으로, 해당 조건에 각각 뺄셈과 덧셈으로 표시할 페이지 버튼 개수를 정합니다.
$startPage와 $endPage는 사용자에게 표시할 버튼의 최대 개수가 됩니다.
$startPage는 항상 양수여야 하기에 조건문을 사용하여 제일 낮은 값을 1로 설정합니다.
$endPage는 앞서 설정한 페이지 최대 개수인 $boardTotalCount을 넘으면 안 되므로 마지막 페이지 설정도 함께해줍니다.
이전과 다음 버튼은 사용자가 보고 있는 $page에서 각각 1씩 빼고 더한 값이므로 $page-1과 $page+1로 설정합니다.
이 값은 현재 페이지가 첫 페이지 이거나 마지막 페이지인 경우 나타나지 않도록 조건문과 함께 실행합니다.
"$page != 1"은 페이지가 1페이지가 아닌 경우를 의미하며, "$page != $boardTotalCount"는 페이지가 마지막 페이지가 아닌 경우를 의미합니다.
잘못된 경로로 들어온 사용자 안내하기
만약 사용자가 게시판의 버튼이 아닌 URL을 통해 없는 게시판 페이지에 접속하려는 경우, alert() 기능을 이용해 잘못됐음을 알리고 게시판 첫 페이지로 돌아가게 합니다.
// 게시글이 없을 때?
if($page > $boardTotalCount || $page <= 0){
echo "<script>alert('게시글이 없습니다.');location.href = 'board.php';</script>";
}
또한 connect 폴더에 sessionCheck.php 파일을 별도로 만들어 로그인하지 않은 사용자가 접근하지 못하도록 하는 페이지마다 include 할 수도 있습니다.
예를 들어 수정 및 삭제 페이지 등이 이에 해당됩니다.
<?php
// 로그인 하지 않았을 경우 로그인 페이지로 이동
if(!isset($_SESSION['memberID'])){
Header("location:../login/login.php");
}
?>
이렇게 하면 다양한 경우에 대비해 사이트의 오류를 줄일 수 있고, 사용자에게 안전한 사이트 이용을 위한 안내 역할도 할 수 있게 됩니다.
🚀 코드 보러 가기