기초부터 시작하는 코딩/PHP

PHP를 사용해서 게시판 페이지 Search 기능 만들기

kebab00 2023. 5. 1. 18:28

728x90

- 오늘은 게시판에 검색기능을 추가해 주었습니다.

- 코드를 보시죠

 <div class="right">
    <form action="boardSearch.php" name="boardSearch" method="get">
        <fieldset>
            <legend class="blind">게시판 검색 영역</legend>
            <input type="search" name="searchKeyword" id="searchKeyword" placeholder="검색어를 입력하세요!" required>
            <select name="searchOption" id="searchOption">
                <option value="title">제목</option>
                <option value="content">내용</option>
                <option value="name">등록자</option>
            </select>
            <button type="submit" class="btnStyle3 white">검색</button>
            <a class="btnStyle3 black" href="boardWrite.php">글쓰기</a>
        </fieldset>
    </form>
</div>

- 일단 게시판에 있는 검색 기능의 데이터를 boardSearch.php로 넘겨 줍니다.

- boardSearch 코드를 보시죠

<?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, 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 "content":
            $sql .= "WHERE m.youName LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
            break;
    }
     $result = $connect -> query($sql);

     $totalCount = $result -> num_rows;
?>

<!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">
            <picture class="intro__images">
                <source srcset="../assets/img/board01.png, ../assets/img/board01@2x.png 2x, ../assets/img/board01@3x.png 3x" />
                <img src="../assets/img/board01.png" alt="회원가입 이미지">
            </picture>
            <h2>게시판</h2>
            <p class="intro__text">
                웹디자이너, 웹 퍼블리셔, 프론트앤드 개발자를 위한 게시판입니다.<br>
                총 <em><?= $totalCount ?></em>건의 게시물이 검색되었습니다.
            </p>
        </div>
        <!-- //intro__inner -->
        <div class="board__inner">
            <div class="left">
                * 총 <em><?= $totalCount ?></em>건의 게시물이 등록되어 있습니다.
            </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 = 10;
    $viewLimit = ($viewNum * $page) - $viewNum;
    $sql .= "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='5'>게시글이 없습니다.</td></tr>";
        }
    }
?>
                        <!-- <tr>
                            <td>1</td>
                            <td><a href="boardView.html"> 게시판 제목</a></td>
                            <td>케밥</td>
                            <td>2023-03-03</td>
                            <td>111</td>
                        </tr> -->
                    </tbody>
                </table>
            </div>
        </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 && $boardTotalCount !=0 && $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>";
    }
        // 페이지
    for($i=$startPage; $i<=$endPage; $i++){
        $active = "";
        if($i == $page) $active = "active";
        if($page <= $boardTotalCount){
            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>";
    }
?>
                <!-- <li><a href="#">처음으로</a></li>
                <li><a href="#">이전</a></li>
                <li class="active"><a href="#">1</a></li>
                <li><a href="#">2</a></li>
                <li><a href="#">3</a></li>
                <li><a href="#">4</a></li>
                <li><a href="#">5</a></li>
                <li><a href="#">6</a></li>
                <li><a href="#">7</a></li>
                <li><a href="#">다음</a></li>
                <li><a href="#">마지막으로</a></li> -->
            </ul>
        </div>
    </main>
    <?php include "../include/footer.php" ?>
    <!-- //footer -->
</body>
</html>

- GET 방식으로 전달받은 searchKeyword와 searchOption 값을 이용하여 데이터베이스에서 검색을 수행합니다.

- 검색어와 검색 옵션을 GET 방식으로 전달받아 변수에 할당합니다.

- SQL Injection 공격 방어를 위해 $searchKeyword와 $searchOption 변수에 대해 real_escape_string 함수를 사용하여 escape 문자열을 추가합니다.

- 공통적으로 쓰일 sql문을 작성하고 그 밑에 switch문으로  검색 조건에 따라 실행되는 sql문을 넣습니다.

-  그리고 실행을 시켜주면 됩니다.

- 그리고 html부분입니다.

- 공통적으로 쓰이는 부분들을 인크루드 시켜주고 표 부분에 검색한 결과의 내용만 나오게 해주면 됩니다.

- 마지막 페이지 버튼을 만들 때도 중요한 부분이 있는데 a태그에 넘어가는 주소를 <a href='boardSearch.php?page={$i}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'> 과 같이 검색키워드와 검색옵션까지 다 넣어 주어야 합니다.

- 그래야만 원하는 결과를 얻을 수 있게 됩니다.

- 끝!