PHP

PHP로 사이트 만들기 (게시판 검색)

이미사용 2023. 5. 1. 19:31
명언
-
728x90
반응형

모든 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을 하여 다음페이지로 넘어 갈수 있게 해주고, 마지막으로와 다음 버튼이 생성됩니다.