Web/Develop_PHP+MySQL

웹 페이지 만들기 - 게시판 검색

Alioth02 2024. 6. 2. 15:21

1. board.php

<div class='search_box'>
	<form action='search.php' method='get'>
    
		<!--카테고리-->
		<select name='category'>
			<option value='title'>제목</option>
			<option value='writer'>작성자</option>
			<option value='content'>내용</option>
		</select>
        
		<!--검색 입력 창-->
		<input type='text' name='search'> <button>검색</button>
	</form>
</div>

게시판을 출력해주는 board.php에

검색 내용과 카테고리를 search.php로 보내주는

form 태그를 추가해준다.

2. search.php

<?php 
// 에러 체크
error_reporting( E_ALL );
ini_set( "display_errors", 1 );

// 세션
require_once("function/session.php");

// 세션 체크 -> 로그인 사용자만 접근 가능
if(!isset($_SESSION['userid'])) {
	echo "<script>alert('로그인이 필요한 게시판 입니다.');</script>";
	echo "<script>location.replace('index.php')</script>";
}

// DB 정보
$conn = mysqli_connect('127.0.0.1', 'user', 'user1234', 'board');

// 변경된 값
// 사용자 검색 값 가져오기
$search = $_GET['search'];
$category = $_GET['category'];

// 현재 페이지 값
if(isset($_GET['page'])){
    $page = $_GET['page'];
} else {
    $page = 1;
}

$post_num = 10; // 한 페이지 당 게시글 수
$page_num = 5; // 한 블록 당 페이지 수
$sql_num = "select * from post where $category like '%$search%'";
$num_res = mysqli_query($conn, $sql_num);
$row_num = mysqli_num_rows($num_res); // 게시판에 있는 총 게시글 수

$block_num = ceil($page / $page_num); // 블록 값 (ceil -> 올림) // 1
$block_start = ($block_num - 1) * $page_num + 1; // 블록의 시작번호 // 1
$block_end = $block_start + $page_num - 1; // 블록의 마지막 번호 // 5

// DB 올라간 총 게시글 수 / 한 페이지에 출력할 페이지 수 = 필요한 페이지 수
$total_page = ceil($row_num / $post_num);

// 블록의 마지막 페이지 번호가 필요한 페이지 수를 넘어가지 않도록 설정
if($block_end > $total_page) {
    $block_end = $total_page;
}

$total_block = ceil($total_page / $page_num); // 필요한 블록 수
$start_num = ($page-1) * $post_num; // 페이지 별 불러올 게시글의 시작 값

// 변화된 값
$sql = "select * from post where $category like '%$search%' order by idx desc limit $start_num, $post_num"; // 페이징에 따른 게시글 불러오기
?>

<!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, intial-scale=1.0'>

    <link rel="stylesheet" href="/css/board.css">

    <title>게시판</title>
</head>

<body>
    <a href="index.php"><h1>Alioth's Web Page</h1></a>

    <div class="board_area">
        <h3>게시판 목록</h3>

        <div class='search_box'>
            <form action='search.php' method='get'>
                <!--카테고리-->
                <select name='category'>
                    <option value='title'>제목</option>
                    <option value='writer'>작성자</option>
                    <option value='content'>내용</option>
                </select>
                <!--검색 입력 창-->
                <input type='text' name='search'> <button>검색</button>
            </form>
        </div>
    
        <table class="middle">
            <!--컬럼 제목-->
            <thead>
                <tr align=center>
                    <th width=80>글 번호</th>
                    <th width=300>제목</th>
                    <th width=120>작성자</th>
                    <th width=150>작성일</th>
                    <th width=70>조회수</th>
                </tr>
            </thead>
            <!--/컬럼 제목-->

            <?php
            $res = mysqli_query($conn, $sql);

            while($row = mysqli_fetch_array($res)){
                $title = $row['title'];
                
                // 제목 너무 길면 ... 으로 대체
                if(strlen($title)>30) {
                    $title = substr($row["title"], 0, 30) . "...";
                }
            ?>

            <!--row 값-->
            <tbody>
                <tr align=center>
                    <td><?php echo $row['idx'];?></td>
                    <td><a href="read.php?idx=<?=$row['idx']?>"><?php echo $title;?></a></td>
                    <td><?php echo $row['writer'];?></td>
                    <td><?php echo $row['created'];?></td>
                    <td><?php echo $row['hit'];?></td>
                </tr>
            </tbody>
            <!--/row 값-->

            <?php
            }
            ?>
        </table>

        <div class="page_num">
            <ul>
                <?php

                // 이전 페이지 버튼
                if($page <= 1){
                } else {
                    $pre = $page-1;

                    // 변경된 값
                    echo "<li><a href='?page=$pre&category=$category&search=$search'>이전</a></li>";
                }

                // 현 블록의 페이지 버튼
                for($i = $block_start; $i <= $block_end; $i++){
                    if($page == $i){
                        echo "<li><strong>$i</strong></li>";
                    } else {

                        // 변경된 값
                        echo "<li><a href='?page=$i&category=$category&search=$search'>$i</a></li>";
                    }
                }

                // 다음 페이지 버튼
                if($page >= $total_page){
                } else {
                    $next = $page + 1;

                    // 변경된 값
                    echo "<li><a href='?page=$next&category=$category&search=$search'>다음</a></li>";
                }
                ?>
            </ul>
        </div>

        <div class="write_btn">
            <!--글쓰기 페이지로 이동하는 버튼-->
            <a href="write.php"><button>글쓰기</button></a>
        </div>
    </div>
</body>

</html>

기본적으로 board.php와 구성은 비슷하지만

// 사용자 검색 값 가져오기
$search = $_GET['search'];
$category = $_GET['category'];

사용자가 입력한 카테고리와 검색 값을 가져오는 구문과

<?php

// 이전 페이지 버튼
if($page <= 1){
} else {
	$pre = $page-1;
    
	// 변경된 값
	echo "<li><a href='?page=$pre&category=$category&search=$search'>이전</a></li>";
}

// 현 블록의 페이지 버튼
for($i = $block_start; $i <= $block_end; $i++){
	if($page == $i){
		echo "<li><strong>$i</strong></li>";
	} else {
		// 변경된 값
		echo "<li><a href='?page=$i&category=$category&search=$search'>$i</a></li>";
	}
}

// 다음 페이지 버튼
if($page >= $total_page){
} else {
	$next = $page + 1;

	// 변경된 값
	echo "<li><a href='?page=$next&category=$category&search=$search'>다음</a></li>";
}

?>

페이징하는 구문에서

이전 혹은 다음 페이지로 넘어갈 때,

get 요청으로 카테고리와 검색 값을 같이 보내주는 구문을 추가했다.