Lumpy Space Princess - Adventure Time

PHP

게시판 페이지를 수정해봤습니다.

jongyung 2023. 4. 26. 13:12

“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”

- Frederick Philips Brooks
Mythical Man-Month 저자
728x90

설명:

게시판 페이지에서 페이지를 넘길 때 현재 페이지를 나타내도록 하는 설정과 처음으로 넘기는 버튼, 이전으로 넘기는 버튼, 다음으로 넘기는 버튼 그리고 마지막으로 넘기는 버튼을 설정했습니다.

 

추가적으로 게시글이 없을 때 페이지를 넘기는 버튼들을 사라지도록 하는 설정도 했습니다.

board.php

<?php
    // $page = 1;
    if(isset($_GET['page'])){
        $page = (int) $_GET['page'];
    } else {
        $page = 1;
    }

    $viewNum = 20;
    $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']."</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='4'>게시글이 없습니다.</td></tr>";
        }
    }
?>

viewNum 이라는 변수를 만들어서 게시글을 20개 씩 나눠서 보이도록 설정했습니다.

 

여기에 쓰인 속성들에 대해 설명하겠습니다.

fetch_array() 함수는 PHP에서 MySQLi (MySQL Improved Extension) 확장을 사용하여 데이터베이스에서 검색된 결과를 배열 형식으로 반환하는 함수입니다.
fetch_array() 함수는 인자로 MySQLi 결과 객체를 받습니다.
결과 객체는 데이터베이스에서 질의 결과를 담고 있습니다.
fetch_array() 함수는 결과 객체에서 다음 행의 결과를 배열 형식으로 반환합니다.
결과가 더 이상 없을 경우 NULL을 반환합니다. fetch_array() 함수는 기본적으로 두 가지 모드로 실행됩니다.

첫 번째 모드는 MYSQLI_NUM 모드로, 이 모드에서는 숫자형 인덱스와 연관된 키를 가지는 배열을 반환합니다.
두 번째 모드는 MYSQLI_ASSOC 모드로, 이 모드에서는 결과 세트에서 검색된 필드 이름을 키로 사용하는 연관 배열을 반환합니다.

예를 들어, 다음은 fetch_array() 함수를 사용하여 MySQLi에서 검색된 결과를 출력하는 코드입니다.
$result = mysqli_query($conn, "SELECT name, email FROM users");
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    echo "이름: " . $row["name"] . " 이메일: " . $row["email"];
}​

위 코드는 users 테이블에서 이름과 이메일을 선택하고, 결과 객체에서 한 행씩 데이터를 가져와서 출력합니다.

board.php

<?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 12 13
    $pageView = 3;
    $startPage = $page - $pageView;
    $endPage = $page + $pageView;

    // 처음 페이지 초기화
    if($startPage < 1) $startPage = 1;

    // 마지막 페이지 초기화
    if($endPage >= $boardTotalCount) $endPage = $boardTotalCount;
    
    // 첫 페이지로 가기/ 이전 페이지로 가기
    if($page != 1 && $page < $boardTotalCount){
        echo "<li><a href='board.php?page=1'>처음으로</a></li>";
        $prevPage = $page - 1;
        echo "<li><a href='board.php?page={$prevPage}'>이전</a></li>";
    }
    
    // 페이지
    for($i=$startPage; $i<=$endPage; $i++){
        $active = "";
        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>";
    }
?>

보이는 것처럼 페이지를 넘기는 버튼에 대한 설정값들입니다.

 

여기에 쓰인 속성들에 대해 설명하겠습니다.

ceil() 함수는 인수로 받은 실수 값을 올림하여 정수 값으로 반환하는 함수입니다.

예를 들어, ceil(4.2)의 결과는 5이며, ceil(5.9)의 결과는 6입니다.
ceil() 함수는 숫자형 데이터를 다룰 때 유용하게 사용됩니다.
예를 들어, 페이지네이션 기능을 구현할 때 전체 페이지 수를 계산하는데 ceil() 함수를 사용할 수 있습니다.
페이지당 10개의 아이템을 보여주고, 전체 아이템 수가 42개일 경우 전체 페이지 수는 ceil(42 / 10)으로 계산됩니다.
이 경우 결과는 5가 됩니다.

ceil() 함수는 매개변수로 받은 값이 실수일 때만 사용 가능합니다.
따라서 정수형 값을 ceil() 함수에 넘길 경우, 그대로 반환됩니다.

active는 웹 페이지에서 현재 선택된 메뉴나 항목을 나타내기 위한 클래스 이름입니다.
active 클래스를 HTML 요소에 추가하면 해당 요소가 현재 선택된 항목임을 나타내어 스타일을 적용하거나, JavaScript를 사용하여 선택된 항목에 대한 처리를 수행할 수 있습니다.

예를 들어, 웹 사이트에서 네비게이션 메뉴에서 현재 선택된 항목에 대해 다른 스타일을 적용하려면 active 클래스를 사용할 수 있습니다.
아래는 Bootstrap 프레임워크를 사용하여 네비게이션 메뉴에서 현재 선택된 항목을 강조하는 예시 코드입니다.
<ul class="nav nav-pills">
  <li class="nav-item">
    <a class="nav-link <?php if($page == 'home') echo 'active'; ?>" href="home.php">Home</a>
  </li>
  <li class="nav-item">
    <a class="nav-link <?php if($page == 'about') echo 'active'; ?>" href="about.php">About</a>
  </li>
  <li class="nav-item">
    <a class="nav-link <?php if($page == 'contact') echo 'active'; ?>" href="contact.php">Contact</a>
  </li>
</ul>​

위 코드에서는 $page 변수에 현재 페이지의 이름이 저장되어 있습니다. 
각 메뉴 항목의 nav-link 클래스에 active 클래스를 추가하기 위해 PHP의 조건문을 사용하여 $page 변수와 메뉴 항목의 이름이 일치하는지 확인합니다. 
$page 변수와 메뉴 항목의 이름이 일치하면 active 클래스를 추가하고, 그렇지 않으면 active 클래스를 추가하지 않습니다. 
이를 통해 현재 선택된 항목을 강조할 수 있습니다.

게시글이 없을 때 페이지를 넘기는 버튼을 없애는 코드

// 첫 페이지로 가기/ 이전 페이지로 가기
if($page != 1 && $page < $boardTotalCount){
    echo "<li><a href='board.php?page=1'>처음으로</a></li>";
    $prevPage = $page - 1;
    echo "<li><a href='board.php?page={$prevPage}'>이전</a></li>";
}

// 마지막 페이지로/ 다음 페이지로
if($boardTotalCount > 0 && $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>";
}

이 코드는 페이지네이션을 구현하기 위한 것입니다.

첫번째 코드 블록은 현재 페이지가 첫 페이지가 아니고, 마지막 페이지도 아닐 때, "처음으로" 링크와 "이전" 링크를 출력합니다.
두번째 코드 블록은 현재 페이지가 마지막 페이지가 아니고, 총 페이지 수보다 작을 때, "다음" 링크와 "마지막으로" 링크를 출력합니다.

이를 통해 사용자는 페이지를 넘기는데 필요한 링크들을 이용할 수 있습니다.

참고로, $boardTotalCount는 전체 게시글의 수를 나타내는 변수입니다. 페이지네이션을 구현할 때 이 값이 중요합니다.

수정된 코드에서는 $boardTotalCount가 0보다 크면서 페이지가 마지막 페이지가 아니라면 다음 페이지로 가는 버튼과 마지막 페이지로 가는 버튼을 출력하도록 합니다. 

따라서 게시글이 없을 때는 페이지를 넘기는 버튼이 출력되지 않게 됩니다.