Animated Turtle

Query

PHP, 게시판 이용하기(3)

훙구 2023. 5. 1. 12:19

...

728x90
반응형

PHP를 이용하여 게시판과 필요한 기능들 만들기(3)

게시글 검색기능 활성화

검색 결과 예시

PHP 작성하기

<?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;
?>

<!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" ?>
    <!-- include -->

    <main id="main" class="container">
        <div class="intro__inner center">
            <picture class="board__images">
                <source srcset="../assets/img/board01.jpg, ../assets/img/board01@2x.jpg 2x, ../assets/img/board01@3x.jpg 3x" />
                <img src="../assets/img/board01.jpg" alt="소개이미지">
            </picture>
            <h2>게시글 검색 결과</h2>
            <p class="intro__text">
                웹디자이너, 웹퍼블리셔, 프론트엔드 개발자를 위한 게시판입니다.
                총 "<em><?=$totalCount?></em>"건의 게시물이 검색되었습니다.
            </p>
        </div>
        <!-- intro__inner -->

        <div class="board__inner">
        </div>
        <!-- board__inner -->
        <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']."</a></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>23.02.02</td>
                            <td>227</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){
        $prev = $page - 1;
        echo "<li><a href='boardSearch.php?page=1&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>처음으로</a></li>";
        echo "<li><a href='boardSearch.php?page={$prev}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>이전</a></li>";
    }

    // 페이지
    for($i=$startPage; $i<=$endPage; $i++){
        if($page >0 && $page <= $boardTotalCount){
            $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 > 0 && $page < $boardTotalCount){
        $next = $page + 1;
        echo "<li><a href='boardSearch.php?page={$next}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>다음</a></li>";
        echo "<li><a href='boardSearch.php?page={$boardTotalCount}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>마지막으로</a></li>";
    }
?>

                </ul>
            </div>
        </div>
    </main>

    <?php include "../include/footer.php" ?>
    <!-- footer -->
    
</body>
</html>

PHP 정리해보기

검색창 설정

  • 게시판의 검색 form은 위와 같이 설정해줍니다.
  • boardSearch.php로 넘어와 주소에 page가 있다면 page를 받아오고 없다면 page의 초기값을 1로 저장합니다.
  • searchKeyword와 searchOption 변수를 만들어 Get방식으로 받아와 저장합니다.
  • 게시글을 보기위해 필요한 데이터를 불러오는 query문을 sql에 저장합니다.
  • switch문을 사용하여 searchOption에 따라 sql에 query문을 추가합니다.
  • searchOption이 title(제목)일 때 : boardTitle에 searchKeyword변수가 포함되는 조건을 만족하는 것
  • searchOption이 content(내용)일 때 : boardContents에 searchKeyword변수가 포함되는 조건을 만족하는 것
  • searchOption이 name(작성자)일 때 : youName에 searchKeyword변수가 포함되는 조건을 만족하는 것
  • 추가된 query문을 전송하고 query실행 결과값을 result에 저장합니다.
  • result의 개수를 totalCount에 저장합니다.
  • 게시판과 비슷한 형식의 html문서를 출력합니다.
  • board.php에서 사용했던 board 데이터를 출력하는 php를 가져와 사용했습니다.
  • 페이지 번호, 처음페이지, 이전페이지, 다음페이지, 마지막페이지는 동일하게 출력하여 사용하지만 a링크의 주소를 board.php가 아닌 boardSearch.php로 연결시켜주고 searchKeyword와 searchOption을 주소에 추가합니다.

 

 

이상으로 게시판에서 게시글에 대한 검색기능을 활성화 시켜보았습니다 !

728x90
반응형