Winnie The Pooh Bear PHP 사이트만들기 검색

배움기록/PHP

PHP 사이트만들기 검색

코딩은 처음이라 2023. 5. 1. 21:17

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

- Frederick Philips Brooks
Mythical Man-Month 저자
728x90
반응형

PHP 사이트만들기 검색

 

 

 

 

오늘은 PHP사이트의 검색 기능을 추가해봤습니다.

 

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

게시판 검색 기능을 추가해줍니다.

 

$page 변수를 초기화합니다.

현재 페이지 번호를 저장, GET방식으로 page변수가 전달되면 해당 값을 $page 변수에 저장합니다.

그렇지 않으면 $page변수를 1로 초기화 합니다.

 

$searchKeyword(검색어저장) 와 $serarchOption(검색옵션저장) 변수를 GET방식으로 전달받아 처리합니다.

 

real_escape_string()메소드를 사용해 SQL Injection 공격을 방지하고

$sql에 SELCT문을 저장, JOIN 구문을 사용해 게시판 정보와 작성자 정보를 조인합니다.

 

$searchOption 변수에 따라 WHERE 구문을 추가, LIKE연산자를 사용해 검색어가 포함된 결과를 찾습니다.

 

$result 변수에 SQL 쿼리 결과를 저장하고 $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="../html/assets/img/board.png, ../assets/img/join01@2x.png 2x, ../assets/img/join01@3x.png 3x"/>
                <img src="../html/assets/img/board.png" alt="소개이미지">
            </picture>
            <h2>결과 게시판</h2>
            <p class="intro__text">
                웹디자이너, 웹퍼블리셔, 프론트앤드 개발자를 위한 게시판입니다.<br>
                총 <em><?=$totalCount?></em>건의 게시물이 검색되었습니다.
            </p>
        </div>
        <!-- //intro__inner -->

        <div calss="board__inner">
            <div class="board__search">
                <div class="left">
                    *총<em><?=$totalCount?></em>건의 게시물이 등록되어 있습니다.
                </div>
            </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>2022-02-02</td>
                            <td>202</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 && $boardTotalCount !=0 && $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>
        <!-- board__inner -->
    </main>

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

기본 디자인은 게시판과 동일하기 때문에

미리 만들어뒀던 거에서 가져왔습니다.

 

php를 사용해 안에 테이블 안에 들어갈 데이터들을 불러와줍니다.

$viewNum : 한 페이지에 보여줄 게시글 수

$viewLimit : SQL에서 LIMIT절에 사용

$page : 사용자가 요청한 페이지의 번호

$viewLimit 는 현재 페이지에서 보여줄 첫 번째 게시글의 인덱스

 

$sql 변수에는 게시글 목록을 가져오는 SELECT 쿼리문이 저장

이때 LIMIT 절을 사용해 $viewLimit과 $viewNum 값을 적용

 

$connet 객체를 이용해 $sql  쿼리문을 실행하고, 결과를 $result 변수에 저장

 

$result 객체의 num_rows 메소드를 사용해 검색된 총 게시글 수를 계산,

if 문으로 검색된 게시글 수가 0보다 큰지 확인

 

검색된 게시글이 있다면 for문을 이용해 $result 객체에서 각각의 게시글 데이터를 가져와 HTML 코드로 출력

게시글이 없을 경우  게시글이 없습니다 라는 메시지를 출력

 

 

반응형