오늘은 게시판 영역 중, 게시글을 검색하는 부분을 작업해보겠습니다.
게시판 검색하기
board.php
input과 select에 name과 id를 붙여줍니다.
<legend class="blind">게시판 검색 영역</legend>
<input type="search" name="searchKeyword" id="searchKeyword" placeholder="검색어를 입력하세요!" required>
<select name="searchOption" id="searchOption">
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;
?>
스크립트는 먼저 데이터베이스 연결 정보를 담은 connect/connect.php와 세션 관리를 위한 connect/session.php 두 개의 PHP 파일을 포함합니다.
$_GET을 사용하여 검색어와 검색 옵션을 받아옵니다. 검색어와 검색 옵션은 $searchKeyword와 $searchOption 변수에 저장됩니다.
검색어는 real_escape_string() 함수를 사용하여 SQL 인젝션 공격을 방지하기 위해 이스케이프 처리를 합니다.
검색어와 검색 옵션에 따라 SQL 쿼리문이 동적으로 생성되며, switch 문을 사용하여 검색 옵션에 따라 WHERE 절의 조건을 다르게 합니다.
최종 SQL 쿼리문은 게시글 제목, 내용 또는 작성자 이름에 따라 검색 결과를 내림차순으로 정렬합니다.
검색 결과의 총 개수는 num_rows 메서드를 사용하여 $totalCount 변수에 저장됩니다.
boardSearch.php 페이지
<?php
// 총 페이지 갯수
$boardTotalCount = ceil($totalCount/$viewNumber);
// 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 && $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($page <= $boardTotalCount){
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){
$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>";
}
?>
검색 결과 전체 갯수를 페이징 처리할 수 있는 페이지 수로 나누어 총 페이지 수를 계산하고, 페이지 번호를 중심으로 좌우로 몇 개의 페이지 링크를 보여줄지를 정하기 위해 $pageView 변수를 설정합니다.
그 다음, 현재 페이지에서 좌우로 $pageView 페이지씩 보여주기 위해 시작 페이지와 끝 페이지를 계산합니다. 그리고, 시작 페이지가 1보다 작으면 1로 초기화하고, 끝 페이지가 전체 페이지 수보다 크거나 같으면 전체 페이지 수로 초기화합니다.
그 후, 현재 페이지가 1보다 크고 전체 페이지 수보다 작거나 같으면 "처음으로"와 "이전" 링크를 생성하고, $startPage부터 $endPage까지의 페이지 번호에 대한 링크를 생성합니다. 현재 페이지와 페이지 번호가 같은 경우 "active" 클래스를 적용합니다.
마지막으로, 현재 페이지가 전체 페이지 수보다 작으면 "다음"과 "마지막으로" 링크를 생성합니다.
검색 키워드와 검색 옵션 정보는 $searchKeyword와 $searchOption 변수를 통해 전달되며, 링크를 통해 페이지 번호와 함께 GET 방식으로 전달됩니다.