Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Leeyanggoo

[PHP] 게시판4 -> 게시판 조회수 / 검색 기능 만들기 본문

2023/MySQL

[PHP] 게시판4 -> 게시판 조회수 / 검색 기능 만들기

Leeyanggoo 2023. 5. 1. 14:32

늘어나라 조회수

<?php
    // 게시글 번호 확인
    if(isset($_GET['boardID'])) {
        $boardID = $_GET['boardID'];

        // 보드 뷰 + 1
        $sql = "UPDATE board SET boardView = boardView + 1 WHERE boardID = {$boardID}";
        $connect -> query($sql);


        // echo $boardID;

        $sql = "SELECT b.boardContents, b.boardTitle, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(m.memberID = b.memberID) WHERE b.boardID = {$boardID}";
        $result = $connect -> query($sql);

        if($result && $result->num_rows > 0){
            $info = $result -> fetch_array(MYSQLI_ASSOC);

            echo "<tr><th>제목</th><td>".$info['boardTitle']."<td/></tr>";
            echo "<tr><th>등록자</th><td>".$info['youName']."<td/></tr>";
            echo "<tr><th>등록일</th><td>".date('Y-m-d', $info['regTime'])."<td/></tr>";
            echo "<tr><th>조회수</th><td>".$info['boardView']."<td/></tr>";
            echo "<tr><th>내용</th><td>".$info['boardContents']."<td/></tr>";
        } else {
            // echo "<tr><td colspan='5'>게시글이 없습니다.</td></tr>";
            echo "<script>alert('게시글이 없습니다.');location.href = 'board.php';</script>";
        }
    } else {
        // echo "<tr><td colspan='5'>잘못된 접근입니다.</td></tr>";
        echo "<script>alert('잘못된 접근입니다.');location.href = 'board.php';</script>";
    }
?>

 

조회수 기능은 "boardView.php"의 php 작성문에 추가했습니다.

sql의 UPDATE 실행문을 통해 boardView를 "boardView + 1"로 변경합니다.

WHERE을 작성하여 테이블 board의 boardID와 불러온 boardID를 비교하고 일치하면 sql 실행문을 실행합니다.

 

검색을 해보아라 boardSearch.php

<form action="boardSearch.php" name="boardSearch" method="get">
    <fieldset>
        <legend class="blind">게시판 검색 영역</legend>
        <input type="search" name="searchKeyword" id="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>
<?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, 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";

    // 합치기
    $sql = "SELECT b.boardID, b.boardTitle, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) ";
    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;
?>

 

board.php에 있는 게시글 검색 <form>의 두 가지 요소의 입력 값을 가져옵니다.

<input> 태그의 사용자가 입력한 단어를 'searchKeyword'라는 id로 받아옵니다.

<select> 태그의 <option>으로 사용자가 선택한 옵션을 'searchOption'이라는 id로 받아옵니다.

두 데이터 모두 GET 방식으로 받아오기 때문에 추후 URL에 해당 조건이 표시됩니다.

 

$sql로 sql 실행문을 적습니다. 여기서 사용자가 선택한 옵션과 검색한 키워드를 조건으로 걸어야 합니다.

따라서 기본적으로 불러올 테이블의 데이터를 SELECT 실행문으로 적은 뒤 조건문을 추가하기 위해 마지막에 빈 공백(한 칸 띄어쓰기)을 추가합니다.

 

사용자가 select 요소로 선택한 옵션은 총 3개로, 각각의 value(title, content, name)로 받아오기 때문에 조건문이 3개 필요합니다.

여러 옵션에 맞는 조건을 추가하기 위해 switch문으로 해당 조건마다 변경될 sql을 적습니다.

$boardOption의 해당 조건이 맞으면 break를 통해 실행을 멈추고, 아니라면 맞는 조건이 나올 때까지 실행합니다.

 

GET 방식은 URL 뒤에 쿼리 문자열 형태로 포함됩니다.

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

    // 페이지
    for($i=$startPage; $i<=$endPage; $i++){
        $active = "";
        if($i == $page) $active = "active"; // 보고 있는 페이지가 같으면 active라는 문자열 추가

        echo "<li class='{$active}'><a href='boardSearch.php?searchKeyword={$searchKeyword}&searchOption={$searchOption}&page={$i}'>{$i}</a></li>";
    }

    // 다음
    if($page > 0 && $page < $boardTotalCount){
        $nextPage = $page + 1;
        echo "<li><a href='boardSearch.php?searchKeyword={$searchKeyword}&searchOption={$searchOption}&page={$nextPage}'>다음</a></li>";
        echo "<li><a href='boardSearch.php?searchKeyword={$searchKeyword}&searchOption={$searchOption}&page={$boardTotalCount}'>마지막으로</a></li>";
    }
?>

 

총 페이지 개수 및 처음, 마지막 페이지를 초기화하는 부분은 기존에 만들었던 board.php와 동일하게 진행합니다.

게시글 검색 결과 또한 게시판 모양의 테이블 안에 데이터를 입력하여 출력해야 하기 때문에 board.php의 틀을 가져와서 수정하는 방향으로 작업합니다.

 

boardSearch.php 상단에 $searchKeyword와 $searchOption을 GET 방식으로 받아왔습니다.

GET 방식은 URL의 쿼리 문자열을 통해 GET 요청에 필요한 데이터를 전송하는 방식입니다.

일반적으로 "URL에 표시한다"고 표현하는 것은 HTTP 요청에서 GET 메서드를 사용하여 데이터를 전송할 때, URL 뒤에 쿼리 문자열(query string) 형태로 포함된다는 의미입니다.

 

게시판에서는 echo() 안의 <li> 태그를 출력할 때 <a href= 뒤에 'board.php?page={$nextPage}'와 같은 방식으로 GET 요청에 필요한 데이터를 전송했습니다.

여기서 물음표(?)는 쿼리 문자열을 구분하는 것이며, 여러 개의 매개변수를 전달할 때는 '&' 기호로 구분합니다.

 

따라서 검색 결과를 표시하기 위해서는 3가지의 조건이 필요하기 때문에 echo()로 출력할 <li> 태그 속의 링크를 수정해야 합니다.

1. 사용자가 입력한 키워드 $searchKeyword

2. 사용자가 선택한 조건 $searchOption

3. 몇 페이지에 데이터를 출력할 것인지 $page

이 조건들은 각 중괄호({ }) 안에 변수들로써 쿼리 문자열을 구성하고 있습니다.

 

예를 들어, 아래와 같이 작성된 코드는 boardSearch.php 파일로 이동하며, URL 쿼리 문자열을 통해 검색어, 검색 옵션, 이전 페이지 정보를 전달합니다.

 

<li><a href='boardSearch.php?searchKeyword={$searchKeyword}&searchOption={$searchOption}&page={$prevPage}'>이전</a></li>

 


 

🚀 코드 보러 가기

🚀 index.html로 쳐들어 가기(HTML만 방문 가능)