모든 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;
?>
- 게시판 (boardSearch.php)에서 입력한 검색 정보를 $_GET으로 가져 옵니다.
- 이것을 SQL Injection 공격으로부터 보호하기 위해 real_escape_string() 함수를 이용하여 정제한후 trim()을 이용해 띄워쓰기를 없애 줍니다.
- sql문을 작성해 두테이블에서 필요한 정보만을 가져오기 위해 JOIN을 이용 하였습니다.
- 그후 switch 문구를 이용해 $searchOption의 정보에 따라 그에 맞는 sql문을 작성 합니다.
- 마지막으로, 생성된 sql 쿼리를 query() 함수를 이용하여 실행하고, 검색 결과의 총 개수를 변수 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); // fetch_array 배열로 불러오기
echo "<tr>";
echo "<td>".$info['boardID']."</td>";
echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</td>"; //?는속성과속성값설정 클릭한값의 보터ID를 가져옴 GET방식
echo "<td>".$info['youName']."</td>";
echo "<td>".date('Y-m-d', $info['regTime'])."</td>"; //php날짜데이터
echo "<td>".$info['boardView']."</td>";
echo "</tr>";
}
} else {
echo "<tr><td colspan='5'>게시글이 없습니다.</td></tr>";
}
}
?>
- $viewNum 변수는 페이지당 보여지는 게시글의 개수를 정해주어 저장하였습니다.
- $viewLimit 변수는 보여질 게시글의 시작 위치를 계산하여 저장하였습니다.
- sql문을 사용하여 LIMIT 절을 이용하여 $viewLimit부터 $viewNum 개수만큼의 게시글을 불러옵니다.
- sql문을 실행하여 나온 값을 $result에 저장합니다.
- 조건으로 $result에 값이 있을때 $result에 있는 값의 개수를 num_rows를 통해 가져와 $count 에 저장합니다.
- $count가 0보다 크면 for문을 이용하여 $result에 담긴 결과물을 배열 형태로 순회하며 게시글 정보를 echo를 통하여 출력합니다. 만약 $count가 0이거나 작다면 "게시글이 없습니다"라는 메세지가 출력됩니다.
검색 결과의 게시글의 페이지와 페이지의 링크 버튼를 출력하기
<?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(isset($boardTotalCount) && $page <= $boardTotalCount && $page >= 1){ //글이 없을 때 처음으로이전 다음마지막으로 없애기
if($startPage < 1) $startPage = 1;
if($endpage >= $boardTotalCount) $endpage = $boardTotalCount; //
//처음으로/이전
if($page != 1){
$prevPage = $page - 1;
$searchOption = $_GET ['searchOption'];
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";
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>";
}
} else echo "게시글이 없습니다."
?>
- 게시글 총 갯수 $totalCount와 한 페이지에 보여줄 게시글 수 $viewNum를 나누어서 ceil을 이용해 소수점을 올려서 총 페이지 수를 계산하여 $boardTotalCount에 저장합니다.
- 현재 페이지를 중심으로 몇 개의 페이지 링크를 보여줄지를 $pageView 에 저장 하여 줍니다
- 조건을 넣어서 $boardTotalCount 값이 존재 하고$page <= $boardTotalCount이며,.$page >= 1 일때 다음조건을 실행하도록 해줍니다 만약 3개중 하나라도 맞지 않는다면 "게시글이 없습니다."가 출력됩니다.
- $startPage와 $endpage 변수는 현재 페이지를 중심으로 보여줄 페이지 번호 범위를 계산합니다.($startPage가 1보다 작을 경우 1로 통일 하게 해주고, $endpage가 $boardTotalCount보다 크거나 같을 경우 $boardTotalCount로 통일 해줍니다.)
-처음으로와/ 이전 으로가는 링크버튼은 조건으로 현재페이지$page가 1이 아닐때 실행 되며; 현재페이지를 -1 하여 이전페이지로 넘어 갈수 있게 해주고, 처음으로 버튼과 이전버튼이 생성됩니다.
-i = $startPage 부터 $endpage까지의 반복하며 페이지 링크 버튼을 출력합니다.
-$active에 빈문자열을 저장한후 초기화를 한후 i가 현재페이지 $page와 똑같을때 $active = "active"를 저장해주고
그링크버튼의 class에 $active를 추가해줍니다.
-마지막으로/ 다음 페이지 링크 버튼은 조건으로 현재 페이지가 마지막 페이지 $boardTotalCount가 아닐때 실행 되며,
현재 페이지를 +1을 하여 다음페이지로 넘어 갈수 있게 해주고, 마지막으로와 다음 버튼이 생성됩니다.