Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

Leeyanggoo

[PHP] 게시판3 -> 게시판 페이지 설정하기(총 페이지 개수 설정) 본문

2023/MySQL

[PHP] 게시판3 -> 게시판 페이지 설정하기(총 페이지 개수 설정)

Leeyanggoo 2023. 4. 26. 19:02

총 페이지 개수 구하기

<?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 조건으로 변경하여 해당 페이지에 맞는 게시글이 나오도록합니다.

 

GET 요청으로 불러온 페이지는 URL에 표시됩니다.

 

페이지 이동 버튼 만들기

 

<?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");
    }
?>

 

이렇게 하면 다양한 경우에 대비해 사이트의 오류를 줄일 수 있고, 사용자에게 안전한 사이트 이용을 위한 안내 역할도 할 수 있게 됩니다.

 


 

🚀 코드 보러 가기

🚀 index.html로 쳐들어 가기(HTML만 방문 가능)