PHP

PHP Search페이지 구현하기

Hyeon been 2023. 5. 1. 12:20

한번씩 읽고 가세요.

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

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

Search

                <div class="right">
                    <form action="boardSearch.php" name="boardSearch" method="get">
                        <fieldset>
                            <legend class="blind">게시판 검색 영역</legend>
                            <input type="search" name = "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 href="boardWrite.php" class="btnstyle3">글쓰기</a>
                        </fieldset>
                    </form>
                </div>

board메인 페이지의 search from박스의 action과 name method를 설정해줍니다.

그리고 search.php 페이지를 만들어줍니다.

 

search.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="pink">
    <?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 small">
                <source srcset="../assets/img/join01.png, ../assets/img/join01@2x.png 2x, ../assets/img/join01@3x.png 3x" />
                <img src="../assets/img/join01.png" alt="회원가입 이미지">
            </picture>
            <h2>결과 게시판</h2>
            <p class="intro__text">
                웹디자이너, 웹 퍼블리셔, 프론트앤드 개발자를 위한 게시판입니다.<br>
                총 <?="<b><em>${totalCount}</em></b>"?>건의 게시물이 검색되었습니다.
            </p>
        </div>
        <div class="board__btn">
                <a href="board.php" class="btnstyle3">목록보기</a>
            </div>
        <!-- boardIntro__inner -->
        <div class="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>";
                };
            }
        }
    

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

    $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}'>이전</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>";
    

    }
?>
                    </ul>
                <!-- <ul>
                        <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>
            <div>
        </div>
         <!-- board__inner -->
    </main>
    <?php include "../include/footer.php"?>
    <!-- //footer -->
</body>
</html>

레이아웃은 board 메인과 동일합니다.

    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";
    
    $result = $connect -> query($sql);
    $totalCount = $result -> num_rows;

(int)를 사용하여 "page" 값을 정수로 캐스팅하고 이를 $page 변수에 할당합니다. URL에 "page"가 설정되지 않은 경우 코드는 $page 변수를 1로 설정합니다.

이 코드는 일반적으로 웹사이트에서 페이지 매김에 사용되며 "페이지" 값에 따라 표시할 결과 페이지가 결정됩니다. 사용자가 "페이지"에 대한 값을 지정하지 않으면 기본값은 페이지 1로 설정됩니다.

 

그후 키워드와 옵션을 정의 해준 뒤 문자열 검사까지해줍니다. 그 후 sql문을 활용하여 데이터를 불러옵니다.

 

                    <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>";
                };
            }
        }
    

?>
                        <!-- <tr>
                            <td>1</td>
                            <td><a href="boardView.html">게시판 제목</a></td>
                            <td>김현빈</td>
                            <td>2023-04-24</td>
                            <td>100</td>
                        </tr> -->
                    </tbody>

그 다음  html tbody안에 <?php?> 를 사용하여 viewNum을 viewLimit 를 정의 해주고  LIMIT를 사용하여 검색 목록의 수를 

제한 해줍니다.

그 후 게시판 형식을 불러와줍니다.

php------

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

    $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}'>이전</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>";
    

    }
?>

검색하였을 때 도 게시판 메인과 동일하게 다음 이전 처음으로 마지막으로 버튼이 있습니다. Main과 동일한 코드로 구현해줍니다.