PHP

php 게시판 검색 기능

ture403 2023. 5. 1. 13:08

- 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, b.regTime, m.youName, b.boardView FROM board b JOIN mymember m ON(b.memberID = m.memberID) ";
    // $sql = "SELECT b.boardID, b.boardTitle, b.boardConetents, m.youName, b.boardView FROM board b JOIN mymember m ON(b.memberID = m.memberID) WHERE b.boardTitle LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
    // $sql = "SELECT b.boardID, b.boardTitle, b.boardConetents, m.youName, b.boardView FROM board b JOIN mymember m ON(b.memberID = m.memberID) WHERE b.boardConetents LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
    // $sql = "SELECT b.boardID, b.boardTitle, b.boardConetents, m.youName, b.boardView FROM board b JOIN mymember 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="en">
<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">
                <div class="intro_images small">
                    <!-- <img src="assets/img/intro01.png" alt="소개이미지"> -->
                    <picture>
                        <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>
                </div>
                <h2>결과 게시판</h2>
                <p class="intro_text">
                    웹디자이너, 웹퍼블리셔,프론트엔드 개발자를 위한 게시판입니다.
                    <br>관련된 문의사항은 여기서 확인하세요.<br>
                    총 <em><?=$totalCount?></em>건의 게시물이 등록되어 있습니다.
                </p>
        </div>

        <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>";
                
            }
        }else {
            echo "<tr><td colspan='5'>게시글이 없습니다.</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 11
    $pageView = 4;
    $startPage = $page - $pageView;
    $endPage = $page + $pageView;

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

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

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

 

총정리

이 코드는 검색 기능이 있는 웹 페이지를 생성하고 결과를 테이블에 표시하는 PHP 스크립트입니다. 

 

스크립트는 검색할 필드(제목, 내용 또는 이름)를 결정하는 검색 키워드 및 검색 옵션의 형태로 사용자로부터 입력을 받습니다. 

그런 다음 스크립트는 MySQL 데이터베이스를 쿼리하여 일치하는 결과를 검색하고 ID, 제목, 작성자, 등록 날짜 및 각 결과의 조회수에 대한 열이 있는 테이블에 표시합니다.

스크립트에는 페이지 매김 기능도 포함되어 있어 각 페이지에 표시되는 결과 수를 제한하고 다른 페이지로 이동할 수 있는 링크를 제공합니다.

전반적으로 이 스크립트는 웹 기반 게시판에 대한 기본 검색 및 표시 기능을 제공합니다.

 

부분정리

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

이 코드는 현재 페이지 번호를 가져오는데 사용됩니다. 먼저, $_GET['page'] 쿼리 문자열 매개 변수가 설정되어 있는지 확인합니다. 쿼리 문자열 매개 변수는 URL의 끝에 ?page=2와 같이 추가된 매개 변수를 의미합니다.
만약 매개 변수가 설정되어 있다면, $_GET['page'] 값 (정수로 변환)을 $page 변수에 할당합니다. 매개 변수가 설정되어 있지 않으면 $page 변수를 1로 할당합니다.
이렇게 하면 현재 페이지 번호를 가져올 수 있으며, 페이지 번호가 설정되지 않은 경우 기본값으로 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, b.regTime, m.youName, b.boardView FROM board b JOIN mymember m ON(b.memberID = m.memberID) ";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardConetents, m.youName, b.boardView FROM board b JOIN mymember m ON(b.memberID = m.memberID) WHERE b.boardTitle LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardConetents, m.youName, b.boardView FROM board b JOIN mymember m ON(b.memberID = m.memberID) WHERE b.boardConetents LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardConetents, m.youName, b.boardView FROM board b JOIN mymember 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;

 

이 코드는 검색어와 검색 옵션에 따라 게시글을 검색하는 PHP 코드입니다. 기본적인 구조는 다음과 같습니다.

GET 방식으로 검색어와 검색 옵션을 받아옵니다.
받아온 검색어와 검색 옵션을 정리합니다. 여기서 real_escape_string() 함수를 사용하여 SQL 인젝션을 방지합니다.
검색 옵션에 따라 SQL 쿼리를 생성합니다. 검색 옵션은 title, content, name 중 하나이며, 각각 게시글 제목, 내용, 작성자 이름을 검색합니다.
생성된 SQL 쿼리를 실행하여 검색 결과를 가져옵니다.
검색 결과의 총 개수를 구합니다.
검색 결과는 이 코드에서는 아직 출력되지 않았습니다. 따라서 검색 결과를 출력하는 코드가 필요합니다. 이 코드에서는 $result 변수에 검색 결과가 저장되며, $result 변수를 활용하여 검색 결과를 출력할 수 있습니다.

먼저, $viewNum 변수에는 한 페이지에 보여줄 게시글 수가 할당됩니다. 그리고 $page 변수는 GET 방식으로 넘어오는 현재 페이지 값입니다. 이때, GET 방식으로 page 값이 없으면 기본적으로 1페이지를 보여주도록 합니다.

 //총 페이지 갯수
    $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 ){
        echo "<li><a href='boardSearch.php?page=1&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>처음으로</a></li>";
        $prevPage = $page-1;
        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";
        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>";
    }

 

이 코드는 검색 결과를 페이지로 나누어 표시하는 기능을 구현한 부분입니다.

먼저, $boardTotalCount 변수를 사용하여 전체 검색 결과 수를 한 페이지에 표시할 검색 결과 수($viewNum)로 나누어 총 페이지 수를 구합니다.

그 후, $pageView 변수를 사용하여 현재 페이지 주변에 표시할 페이지 수를 설정하고, 현재 페이지($page)를 기준으로 시작 페이지($startPage)와 끝 페이지($endPage)를 계산합니다.

다음으로, 시작 페이지와 끝 페이지를 제한하는 if 문을 사용하여 $startPage가 1보다 작으면 $startPage를 1로, $endPage가 $boardTotalCount보다 크거나 같으면 $endPage를 $boardTotalCount로 설정합니다.

마지막으로, 페이지 이동 링크를 출력하는 부분입니다. 만약 현재 페이지가 1페이지가 아니고 $boardTotalCount 이하이면, "처음으로"와 "이전" 링크를 출력합니다. 그 후, $startPage부터 $endPage까지 for 문을 사용하여 페이지 번호를 출력하고, 현재 페이지는 활성화된 상태로 출력합니다. 마지막으로, 현재 페이지가 마지막 페이지가 아니고 $boardTotalCount 이하이면, "다음"과 "마지막으로" 링크를 출력합니다. 모든 페이지 이동 링크에는 현재 검색어와 검색 옵션을 함께 전달합니다.