본문 바로가기
PHP

PHP 게시판(3)

by dongjin6539 2023. 5. 1.
728x90
반응형

PHP 게시판(3)

 

참고 코드 사이트

 

게시판 게시글 갯수
<?php
    include "../connect/connect.php";
    include "../connect/session.php";

    // 게시글 총 갯수
    $sql = "SELECT count(boardID) FROM board";
    $result = $connect -> query($sql);

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

<div class="board__inner">
    <div class="board__search">
        <div class="left">
            * 총 <em><?=$boardTotalCount?></em>건의 게시물이 등록되어 있습니다.
        </div>
    </div>
</div>

작성 방법

  • 게시판 게시글의 총 갯수를 확인해주기 위해서 이미 전에 게시글의 총 갯수를 구했던 적이 있습니다.
  • https://dongjin6539.tistory.com/92 블로그 페이지에 게시판 페이지 수 버튼의 코드를 보시면 있습니다.
  • 그 php 코드를 위로 가져와서 html 코드의 입력할 부분에 php약식인 <?=?>을 사용해서 변수 $boardTotalCount로 갯수를 저장해주었기 때문에 <?=$boardTotalCount?>를 입력해줍니다.

 

게시판 검색 결과 확인
<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>
  • 먼저 board.php에 form 태그의 action을 boardSearch.php로 변경해주고 method를 get방식으로 불러오기 위해 get로 변경해줍니다.
  • 다음 input 태그의 name과 id를 searchKeyword를 지정해주고 select 태그의 name과 id를 searchOption으로 지정해줍니다.
<?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="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/board01.png, ../assets/img/board01@2x.png 2x, ../assets/img/board01@3x.png 3x" />
                <img src="../assets/img/board01.png" alt="게시판 이미지">
            </picture>
            <h2>게시판 검색 결과</h2>
            <p class="intro__text">
                웹 디자이너, 웹 퍼블리셔, 프론트 엔드 개발자를 위한 게시판입니다.<br>
                * 총 <em><?=$totalCount?></em>건의 게시물이 등록되어 있습니다.
            </p> 
        </div>
        <!-- //intro__inner -->

        <div class="board__inner">
            <div class="board__btn">
                <a href="board.php" class="btnStyle3">목록보기</a>
            </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']."</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>";
        }
    }
?>
                    </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){
        echo "<li><a href='boardSearch.php?searchKeyword={$searchKeyword}&searchOption={$searchOption}&page=1'>처음으로</a></li>";
        $prevPage = $page - 1;
        echo "<li><a href='boardSearch.php?searchKeyword={$searchKeyword}&searchOption={$searchOption}&page={$prevPage}'>이전</a></li>";
    }

    // 페이지
    for($i=$startPage; $i<=$endPage; $i++){
        if($page > 0 && $page <= $boardTotalCount){
            $active = "";
            if($i == $page) $active = "active";
            echo "<li class='{$active}'><a href='board.php?page={$i}'>{$i}</a></li>";
        }        
    }

    // 다음, 마지막으로
    if($page !== $boardTotalCount && $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>";
    } 
?>
                </ul>
            </div>
        </div>
        <!-- //board__inner -->
    </main>
    <!-- //main -->

    <?php include "../include/footer.php" ?>
    <!-- //footer -->    
</body>
</html>
  • html 구역에 태그는 게시판(board.php)에서 사용한 것을 필요한 것을 가져옵니다.
  • 공통적인 부분은 <?php include "" ?>를 사용해서 php링크를 가져옵니다.

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;
?>
  • include로 연결 시키고 회원의 정보를 가져옵니다.
  • GET 방식으로 주소의 page를 if문을 사용해서 가져옵니다.
  • GET 방식으로 searchKeyword, searchOption을 가져옵니다. 그리고 해킹이나 특수문자를 방지하기 위해서 real_escape_string( )를 사용해주고 앞뒤 공백을 무시하도록 trim( )을 사용해줍니다.
  • 변수 $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) ";를 작성해줍니다.
  • 그리고 searchOption이 3가지로 있기 때문에 다중if문보다 switch문을 사용해주는 것이 훨씬 좋습니다. 그래서 case별로 "title", "content", "name" 별로 변수 $sql문에 조건문을 추가 시켜줍니다.
  • 그리고 query문으로 변수 $sql문을 변수 $result로 가져오고 그것의 갯수를 변수 $totalCount로 저장시켜줍니다. 

 

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

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

    // 페이지
    for($i=$startPage; $i<=$endPage; $i++){
        if($page > 0 && $page <= $boardTotalCount){
            $active = "";
            if($i == $page) $active = "active";
            echo "<li class='{$active}'><a href='board.php?page={$i}'>{$i}</a></li>";
        }        
    }

    // 다음, 마지막으로
    if($page !== $boardTotalCount && $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>";
    } 
?>
  • 구성 참고 : https://dongjin6539.tistory.com/92 게시판 페이지 수 버튼 부분 참고
  • 여기서 처음으로, 이전, 페이지, 다음, 마지막으로 부분에 a링크 태그 부분을 기존에 있던 것을 사용하면 검색결과의 페이지가 아니라 게시판의 페이지로 이동하게 됩니다.
  • 그래서 주소를 boardSearch.php?searchKeyword=${searchKeyword}&searchOption=${searchOption}&page=${ }를 입력해서 page부분에는 각각 알맞는 변수를 입력해줍니다.

 

게시판 조회수
<?php
    $boardID = $_GET['boardID'];

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

    if(isset($_GET['boardID'])) {
        $boardID = $_GET['boardID'];
    
        $sql = "SELECT b.boardContents, b.boardTitle, b.memberID, 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){
            $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='4'>게시글이 없습니다.</td></tr>";
    }
?>
  • 기존에 있던 boardView.php 코드에 // 보드 뷰 + 1을 추가했습니다. 
  • 변수 $sql에 "UPDATE board SET boardView = boardView + 1 WHERE boardID = {$boardID}"해서 열람한 boardView의 boardID와 가져온 boardID가 같으면 조회수에 해당하는 boardView에 +1을 UPDATE를 해주는 sql문을 작성해줍니다.
  • 이제 query로 변수 $sql문을 연결시켜줍니다. 

 

728x90
반응형