게시판 만들기(검색기능 구현하기)
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 변수에 저장합니다.