MYSQL/php

php로 홈페이지 만들기_게시판 검색시스템

아라라_ 2023. 5. 1. 15:11

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

Frederick Philips Brooks
Mythical Man-Month 저자
728x90

 

오늘은 게시판에 검색 시스템을 만들어 정리하려고 합니다.


코드

<?php
    include "../connect/connect.php";
    include "../connect/session.php";

    if(isset($_GET['page'])){
        $page = (int) $_GET['page'];
    }else{
        $page = 1;
    }
    $searchKeyword = $_GET['searchKeyword'];
    $searchOption = $_GET['searchOption'];

    

    $searchKeyword = $connect -> real_escape_string(trim($searchKeyword));
    $searchOption = $connect -> real_escape_string(trim($searchOption));

    $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) ";
    // $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE b.boardTitle LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";
    // $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE b.boardContents LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";
    // $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE m.youName LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";

    switch($searchOption){
        case "title":
            $sql .= "WHERE b.boardTitle LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
            break;
        case "content":
            $sql .= "WHERE b.boardContents LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
            break;
        case "name":
            $sql .= "WHERE m.youName LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
            break;
    }
    $result = $connect -> query($sql);
    $totalCount = $result -> num_rows;
    // echo $totalCount;
?>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>결과 계시판</title>
    <?php include "../include/head.php" ?> 
</head>
<body class="gray">
    <?php include "../include/skip.php" ?>
    <!-- //skip -->

    <?php include "../include/header.php" ?>
    <!-- //header -->

    <main id="main" class="container">
        <div class="intro__inner center bmStyle">
            <picture class="intro__images small">
                <img src="../assets/img/join01.png" alt="게시판 이미지">
            </picture>
            <h2>검색 결과 계시판</h2>
            <p class="intro__text">
                웹디자이너, 웹퍼블리셔, 프론트앤드 개발자를 위한 게시판입니다.<br>
                총 <em><?=$totalCount?></em>건의 게시물이 검색되었습니다.
<?php
    // echo "총 <em>{$totalCount}</em>건의 게시물이 검색되었습니다."
?>
            </p>
        </div>
        <!-- //intro__inner -->
        <div class="board__inner">

            </div>
            <div class="board__table">
                <table>
                    <colgroup>
                        <col style="width: 5%;">
                        <col>
                        <col style="width: 10%;">
                        <col style="width: 15%;">
                        <col style="width: 7%;">
                    </colgroup>
                    <thead>
                        <tr>
                            <th>번호</th>
                            <th>제목</th>
                            <th>등록자</th>
                            <th>등록일</th>
                            <th>조회수</th>
                        </tr>
                    </thead>
                    <tbody>
<?php
    $viewNum = 20;
    $viewlimt = ($viewNum * $page) - $viewNum; 

    $sql .= "LIMIT {$viewlimt}, {$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']."</a></td>";   //?boardId={$info['boardID'] : 겟방식으로 넘김
                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>";
        }
    }

?>
                        <!-- <tr>
                            <td>1</td>
                            <td><a href="boardView.html">게시판 제목</a></td>
                            <td>노지영</td>
                            <td>2023-04-24</td>
                            <td>100</td>
                        </tr> -->
                    </tbody>
                </table>
            </div>
            <div class="board__pages">
                <ul>
<?php
    

    // 총 페이지 갯수
    $boardTotalCount = ceil($totalCount/$viewNum);

    // 1 2 3 4 5 6 7 8 9 10
    $pageView = 4;
    $startPage = $page - $pageView;
    $endPage = $page + $pageView;

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

    // 처음으로/ 이전으로
    if($page != 1 && $page <= $boardTotalCount){
        $prevPage = $page - 1;
        echo "<li><a href='boardSearch.php?page=1&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>처음으로</a></li>";
        echo "<li><a href='boardSearch.php?page={$prevPage}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>이전</a></li>";
    }

    // 페이지 
    if( $page <= $boardTotalCount){
        for ($i=$startPage; $i <= $endPage; $i++){
            $active = "";
            if($i == $page) $active = "active";
            echo "<li class={$active}><a href='boardSearch.php?page={$i}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>{$i}</a></li>";
        }
    }

    //마지막으로/다음
    if($page != $boardTotalCount && $page <= $boardTotalCount){
        $nextpage = $page + 1;
        echo "<li><a href='boardSearch.php?page={$nextpage}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>다음</a></li>";
        echo "<li><a href='boardSearch.php?page={$boardTotalCount}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>마지막으로</a></li>";
    }
?>
                </ul>
            </div>
        </div>
    </main>
    <!-- // main -->

    <?php include"../include/footer.php"?>
    <!-- // footer -->
</body>
</html>
  • $page 변수는 페이지 번호를 나타냅니다. $_GET 메소드를 통해 페이지 번호가 설정되었는지 확인하고, 설정되어 있지 않은 경우 $page 변수를 1로 설정합니다.
  • 그 다음, $_GET 메소드를 통해 검색어와 검색 옵션을 가져오고, 이를 $searchKeyword와 $searchOption 변수에 저장합니다.
  • $searchKeyword와 $searchOption 변수를 이용하여, MySQL LIKE 연산자와 WHERE 절을 이용해 검색 쿼리를 작성합니다. 검색 옵션에 따라서 검색 대상이 제목, 내용, 작성자 이름인지를 결정하며, 각각 $sql .= 를 이용해 WHERE 절에 추가합니다.
  • $result 변수에 쿼리 결과를 저장하고, num_rows 메소드를 이용해 검색된 게시물의 총 개수를 계산합니다.
  • HTML 코드에서 $totalCount 변수를 이용해 검색된 게시물의 총 개수를 출력하며, 검색된 게시물이 존재하는 경우 for 반복문을 이용해 검색된 게시물을 출력합니다. $viewNum 변수는 한 페이지에서 보여줄 게시물의 수를 나타냅니다. $viewlimt 변수를 통해 보여줄 게시물의 범위를 설정하고, LIMIT 절을 이용해 검색 쿼리에 적용합니다. 검색된 게시물의 번호, 제목, 작성자, 작성일, 조회수를 출력합니다.