Fast Blinking Hello Kitty

PHP

게시판 만들기3

코른이되고싶은코린이 2023. 5. 1. 12:20

728x90

게시판 만들기(검색기능 구현하기)

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;
    // 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">
            <picture class="intro__images small">
                <source srcset="../assets/img/joinEnd01.png, ../assets/img/joinEnd01@2x.png 2x, ../assets/img/joinEnd01@3x.png 3x"/>
                <img src="../assets/img/joinEnd01.png" alt="회원가입 이미지">
            </picture>
            <h2>결과 게시판</h2>
            <p class="intro__text">
                웹 디자이너, 웹 퍼블리셔, 프론트앤드 개발자를 위한 게시판입니다.<br><br>
                총<em><?=$totalCount?></em>건의 게시물이 검색되었습니다.
            </p>
        </div>
    <!-- intro__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 = 20;
    $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>2022-02-02</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 11
    $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>";
    }   
       
    //페이지
    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>

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

보충설명

✨ $_GET을 사용하여 페이지 번호와 검색어, 검색 옵션을 받아옵니다. $_GET은 URL 매개 변수를 가져올 때 사용되는 PHP 전역 변수입니다.

검색어와 검색 옵션을 받아오면, real_escape_string 함수를 사용하여 SQL Injection 공격을 방지하기 위해 문자열에서 특수문자를 이스케이프합니다.

검색 옵션에 따라 쿼리문을 생성합니다. switch 문을 사용하여 옵션에 따라 WHERE 절을 다르게 설정하여 게시글 제목, 내용, 작성자 이름 중 어떤 것을 기준으로 검색할지를 결정합니다.

쿼리문을 실행하여 검색 결과를 $result 변수에 저장합니다. 그리고 num_rows 함수를 사용하여 검색된 게시물의 수를 구합니다.

이 코드에서는 검색어와 검색 옵션에 따라 동적으로 쿼리문을 생성하고 실행하는 것이 핵심입니다. 이를 통해 사용자가 입력한 검색어와 옵션에 따라 정확한 검색 결과를 얻을 수 있습니다.

 

PHP 언어를 사용하여 데이터베이스에서 게시글 목록을 가져와 HTML 테이블 형태로 출력하는 코드입니다.

처음에는 한 페이지에서 보여질 게시글의 수를 지정하는 $viewNum 변수가 정의됩니다.

 $viewLimit 변수는 페이지 번호($page)를 기반으로 보여질 게시글의 범위를 계산합니다. 예를 들어, $page가 1일 때는 $viewLimit는 0이 되고, 2일 때는 20이 되며, 3일 때는 40이 됩니다.

 $sql 변수에 SQL 쿼리가 저장되며, 이 쿼리에는 $viewLimit와 $viewNum이 포함됩니다. 이렇게 함으로써, 각 페이지에서 보여질 게시글의 범위를 지정할 수 있습니다.

데이터베이스에 쿼리를 보내고 결과를 $result 변수에 저장한 후, 결과 집합에서 가져온 각각의 게시글 정보를 반복문(for)을 사용하여 HTML 테이블 행(<tr>)으로 출력합니다. 게시글의 고유 ID(boardID), 제목(boardTitle), 작성자 이름(youName), 작성일(regTime), 조회수(boardView) 등이 표시됩니다.

만약 결과 집합이 비어있다면, "게시글이 없습니다."라는 메시지가 출력됩니다.

메인게시판 총페이지 입력

//총 페이지
    $sql = "SELECT count(boardID) FROM board";
    $result = $connect -> query($sql);

    $boardTotalCount = $result -> fetch_array(MYSQLI_ASSOC);
    $boardTotalCount = $boardTotalCount['count(boardID)'];

게시글 검색창

MySQL 데이터베이스에서 게시물 총 갯수를 구하는 부분입니다.

$sql 변수에 SELECT 문을 이용하여 'board' 테이블의 'boardID' 컬럼의 갯수를 구하는 쿼리문을 저장합니다.

$connect 변수에 저장된 MySQL 데이터베이스 연결 객체의 query() 메소드를 이용하여, 위에서 생성한 쿼리문을 실행하고 그 결과를 $result 변수에 저장합니다.

 $result 변수에 저장된 결과를 fetch_array() 메소드를 이용하여, 연관 배열 형태로 변환하여 $boardTotalCount 변수에 저장합니다.

 $boardTotalCount 변수에서 'count(boardID)' 인덱스를 통해 총 게시물 수를 구하고 이를 $boardTotalCount 변수에 저장합니다.