본문 바로가기

웹 개발

웹 개발 공부 일기장

마지막으로 추가한 게시판 기능을 설명하며 웹 개발은 마치도록 하겠습니다.

 

1. 게시글 검색 기능

 

이제부터 검색 단어와 정렬 기능이 더해져 애초에 게시판에 접속할 때 해당 값을 받도록 하였습니다.

<?php
// 페이지 정보
$page = $_GET['page'];
$totalBoard = Board::countBoard();
$totalPage = (int)($totalBoard / 10) + 1;

if (!$page || $page < 1) {
    $page = 1;
} else if ($page > $totalPage) {
    $page = $totalPage;
}

// 검색 정보
$searchCategory = $_GET['category'];
if (!$searchCategory) {
    $searchCategory = 'idx';
}
$searchWord = $_GET['word'];
if (!$searchWord) {
    $searchWord = '';
}

// 정렬 정보
$sort = $_GET['sort'];
$sortCategory = $_GET['sortCategory'];
if (!$sortCategory) {
    $sortCategory = 'idx';
}
if (!$sort || ($sort != 'desc' && $sort != 'asc')) {
    $sort = 'desc';
}

// 게시글 가져오기
$boardList = Board::searchBoard($page, $searchCategory, $searchWord, $sortCategory, $sort);
?>

 

입력 받은 값들로 해당되는 게시글만 가져오도록 하였고 입력이 없을 시 기본 값을 지정해주었습니다.

    public static function searchBoard($page, $category, $word, $sortCategory, $sort) {
        $db_conn = connectDb();
        $startPage = ($page - 1) * 10;
        $likeWord = "'%".$word."%'";
        $query = "select * from boards where $category like $likeWord order by $sortCategory $sort limit $startPage,10";
        $result = mysqli_query($db_conn, $query);
        mysqli_close($db_conn);
        return $result;
    }

 

게시글을 가져오는 함수에 관한 코드입니다.

검색 기능

 

URL을 보면 검색 컬럼과 단어로 해당되는 게시글만 가져온 것을 확인할 수 있습니다.

 

2. 게시글 정렬 기능

<?php 
    function changeSort($sort) {
        if ($sort == 'asc')
            return 'desc';
        else
            return 'asc';
    }

    $page = $_GET['page'];
    $sort = $_GET['sort'];
    $sortCategory = $_GET['sortCategory'];
    $searchCategory = $_GET['category'];
    $searchWord = $_GET['word'];
    $sort = changeSort($sort);
    $redirect = 'location:/board.php?page='.$page.'&category='.$searchCategory.'&word='.$searchWord.'&sortCategory='.$sortCategory.'&sort='.$sort;
    header($redirect);
?>

 

만약 검색 기능한 상태에서 정렬을 할 경우에 대해 검색을 유지한 상태에서 정렬을 할 수 있게 했습니다.

 

정렬 기능

 

방금 위에서 검색한 상태에서 제목을 클릭하여 제목으로 정렬한 모습입니다.

 

정렬 기능

 

검색 단어 없이도 정렬이 잘 되는 모습입니다.

 

이렇게 작성하면 해당 정렬옵션을 그대로 가지고 다음 정렬을 할 때도 적용되지만, 이정도는 괜찮을 것 같아 넘어가려고 합니다.

 

3. 게시판 페이지 기능

 

위의 게시글 가져오는 코드에서 페이지도 함께 받는 것을 확인할 수 있고 해당 페이지로 원하는 수만큼 게시글을 가져옵니다.

페이지 기능

 

게시판의 2를 클릭하면 다음 2페이지를 볼 수 있습니다.

 

똑같이 마이페이지의 게시글에서도 적용했습니다.

 

페이지 기능

 

위의 검색 기능, 정렬 기능과 페이지 기능을 수행하기 위한 수정된 HTML 코드

<!DOCTYPE html>
<html lang="en">

<head>
    <?php
    require_once('views/includes/head.php');
    require_once('models/board-model.php');
    require_once('models/user-model.php');
    require_once('config/cookie.php');
    // require_once('views/includes/error-check.php');
    
    $userId = getCookie($_COOKIE);
    $userClass = new User($userId);
    $user = $userClass->getUser();
    require_once('getboardList-func.php');

    // 베스트 게시글 리스트 가져오기
    $bestBoardList = Board::getBestBoard();
    $j = 0;
    ?>
    <link rel="stylesheet" href="/static/css/board.css">

    <title>Board</title>
</head>

<body>
    <div id="search" class="container-fluid">
        <!-- 검색 기능 -->
        <form class="d-flex" role="search">
            <select class="form-select" aria-label="Default select example" style="margin-right:0.5rem; width: 10rem;"
                name="category">
                <option selected value="title">제목</option>
                <option value="writer">작성자</option>
                <option value="content">내용</option>
            </select>
            <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search" name="word">
            <button class="btn btn-outline-success" type="submit">Search</button>
        </form>
    </div>
    <section id="main-section">
        <div id="board-list" class="list">
            <ul>
                <h2 style="margin: 2rem">게시판 목록</h2>
                <li id="board-column">
                    <!-- 정렬 기능 -->
                    <p class="board-title"><a
                            href="/board-sort.php?page=<?= $page ?>&category=<?= $searchCategory ?>&word=<?= $searchWord ?>&sortCategory=title&sort=<?= $sort ?>"
                            class="link-secondary">
                            제목
                        </a></p>
                    <p class="board-view"><a
                            href="/board-sort.php?page=<?= $page ?>&category=<?= $searchCategory ?>&word=<?= $searchWord ?>&sortCategory=view&sort=<?= $sort ?>"
                            class="link-secondary">
                            조회수
                        </a></p>
                    <p class="board-writer"><a
                            href="/board-sort.php?page=<?= $page ?>&category=<?= $searchCategory ?>&word=<?= $searchWord ?>&sortCategory=date&sort=<?= $sort ?>"
                            class="link-secondary">
                            작성 일자
                        </a></p>
                </li>
                <?php if ($boardList) {
                    foreach ($boardList as $board) { ?>
                        <hr style="margin: 0;">
                        <li>
                            <p class="board-title"><a href="/board-detail.php?boardId=<?= $board['idx'] ?>&view=1"
                                    class="link-secondary">
                                    <?= $board['title'] ?>
                                </a>
                            </p>
                            <p class="board-view text-secondary">
                                <?= $board['view'] ?>
                            </p>
                            <p class="board-writer text-secondary">
                                <?= $board['date'] ?>
                            </p>
                        </li>

                    <?php }
                } ?>
            </ul>
            <nav aria-label="Page navigation example">
                <ul class="pagination">
                    <li class="page-item"><a class="page-link"
                            href="/board.php?page=<?= $page - 1 ?>&category=<?= $searchCategory ?>&word=<?= $searchWord ?>&sortCategory=<?= $sortCategory ?>&sort=<?= $sort ?>">Previous</a>
                    </li>
                    <!-- 페이지 기능 -->
                    <?php for ($i = 1; $i <= $totalPage; $i++) { ?>
                        <li class="page-item"><a class="page-link"
                                href="/board.php?page=<?= $i ?>&category=<?= $searchCategory ?>&word=<?= $searchWord ?>&sortCategory=<?= $sortCategory ?>&sort=<?= $sort ?>">
                                <?= $i ?>
                            </a></li>
                    <?php } ?>
                    <li class="page-item"><a class="page-link"
                            href="/board.php?page=<?= $page + 1 ?>&category=<?= $searchCategory ?>&word=<?= $searchWord ?>&sortCategory=<?= $sortCategory ?>&sort=<?= $sort ?>">Next</a>
                    </li>
                </ul>
            </nav>
        </div>
        <div id="right-board">
            <div id="mypage" class="list">
                <?php if($user) {?>
                    <div>
                        <div id="mypage-status">
                            <img class="smallImage" src="<?= $user['photo'] ?>" alt="...">
                            <div>
                                <h4>
                                    <?= $user['name'] ?>
                                </h4>
                                <a href="/logout.php" class="link-secondary">로그아웃 ></a>
                            </div>
                        </div>
                        <hr style="margin: 0.5rem 0">
                        <button class="btn btn-dark" type="button" onclick="location.href='/board-write.php'">글쓰기</button>
                        <button class="btn btn-dark" type="button" onclick="location.href='/mypage.php'">마이페이지</button>
                        <div>
        
                        </div>
                    </div>
                <?php } else { ?>
                    <div style="">
                            <a href="/login.php" class="link-secondary">로그인해주세요</a>
                    </div>
                <?php }?>
            </div>
            <div id="best-board" class="list">
                <ul>
                    <h5>베스트 게시글</h5>
                    <?php foreach ($bestBoardList as $board) {
                        $j++; ?>
                        <hr style="margin: 0;">
                        <li>
                            <p>#
                                <?= $j ?>
                            </p>
                            <p class="board-title"><a href="/board-detail.php?boardId=<?= $board['idx'] ?>"
                                    class="link-secondary">
                                    <?= $board['title'] ?>
                                </a>
                            </p>
                            <p class="board-view text-secondary">
                                <?= $board['view'] ?>
                            </p>
                        </li>
                    <?php } ?>
                </ul>
            </div>
        </div>
    </section>
</body>

</html>

 

4. 첨부 파일 다운로드 기능

<?php

    // 다운로드 파일 경로
    $dir_path = "/var/www/html/";       
    // 파일명
    $file_name = $_GET['file'];              
    $file_path = $dir_path.$file_name;
    $file_size = filesize($file_path);
     
    if (file_exists($file_path)) {
        header("Content-Type:application/octet-stream");
        header("Content-Disposition:attachment;filename={$file_name}");
        header("Content-Transfer-Encoding:binary");
        header("Content-Length:{$file_size}");
        header("Cache-Control:cache,must-revalidate");
        header("Pragma:no-cache");
        header("Expires:0");
     
        $fp = fopen($file_path, "r");
     
        while(!feof($fp)) {
            $buf = fread($fp, $file_size);
            $read = strlen($buf);
            print($buf);
            flush();
        }
     
        fclose($fp);
        
    } else {
        die("파일이 존재하지 않습니다.");
    }
?>

 

아래는 파일 다운로드 기능 설명( 다른 블로그에서 가져왔습니다. https://mintea.tistory.com/14)

 

file_exists(string $filename)
- 파일 또는 디렉터리가 있는지 확인합니다. (is_file을 사용해도 괜찮아요)
- $filename = 파일 경로


fopen(
    string $filename,
    string $mode,
    bool $use_include_path = false,
    ?resource $context = null
)
- 다운로드 할 파일을 읽기전용으로 불러옵니다. ($mode="r" 읽기모드)

 

feof(resource $stream)
- 열려있는 파일을 읽을 때 파일 끝까지 다 읽었는지 확인하기 위해 사용합니다.
  파일 포인터가 끝에 있으면 true를 반환합니다.

 

파일 다운로드 기능

 

파일도 정상적으로 다운로드 되는 것을 확인할 수 있습니다.