KnockOn

[3주차 TIL] KnockOn Bootcamp PHP 게시판 글 검색

성밍쟁 2024. 12. 23. 02:25
728x90
반응형

프롤로그

거의 다 됐다.

2024.12.22 - [KnockOn] - [3주차 TIL] KnockOn Bootcamp PHP 게시판 수정 및 삭제

 

[3주차 TIL] KnockOn Bootcamp PHP 게시판 수정 및 삭제

프롤로그저번 글에서는 게시판 생성 및 조회를 진행했었다.2024.12.22 - [KnockOn] - [3주차 TIL] KnockOn Bootcamp PHP 게시판 생성 및 조회 [3주차 TIL] KnockOn Bootcamp PHP 게시판 생성 및 조회프롤로그저번 글2024

taesan-smj.tistory.com

여기서 게시판 수정 삭제를 했었고, 그 해당 코드는

https://github.com/Vak-kas/php/tree/board2

 

GitHub - Vak-kas/php: knockon 웹 모의해킹 코스

knockon 웹 모의해킹 코스. Contribute to Vak-kas/php development by creating an account on GitHub.

github.com

여기에 저장해두었다.

 

 

게시판 글 검색 기능 구현

이번 글은 굉장히 짧을 것이다. 왜냐면 board.php에서만 작성할 거기 때문이다.

<?php
// session_start();
require('../databases.php'); 

// $sql = "SELECT * FROM posts ORDER BY created_at DESC";


include('../base.php');

// 검색 기능 구현
$search_option = isset($_GET['search_option']) ? $_GET['search_option'] : 'title';
$search_term = isset($_GET['search_term']) ? $_GET['search_term'] : '';

// 검색 조건에 따라 SQL 쿼리 설정
if ($search_term) {
    if ($search_option == 'title, content') {
        // 제목과 내용 모두에서 검색
        $sql = "SELECT * FROM posts WHERE title LIKE '%$search_term%' OR content LIKE '%$search_term%' ORDER BY created_at DESC";
    } else {
        // 단일 조건에 대해 검색
        $sql = "SELECT * FROM posts WHERE $search_option LIKE '%$search_term%' ORDER BY created_at DESC";
    }
} else {
    // 검색어가 없으면 모든 글을 가져옴
    $sql = "SELECT * FROM posts ORDER BY created_at DESC";
}
$result = $conn->query($sql);
?>

<link rel="stylesheet" type="text/css" href="/static/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="board.css">

<div class="container my-3">
    <table class="table">
        <thead>
        <tr class="table-dark">
            <th>번호</th>
            <th>제목</th>
            <th>작성자</th>
            <th>작성일</th>
            <th>조회수</th>
        </tr>
        </thead>
        <tbody>
        <?php if ($result->num_rows > 0): ?>
            <?php while ($row = $result->fetch_assoc()): ?>
                <tr>
                    <td><?php echo $row['id']; ?></td>
                    <td>
                        <a href="view.php?id=<?php echo $row['id']; ?>"><?php echo $row['title']; ?></a>
                    </td>
                    <td><?php echo $row['author']; ?></td>
                    <td><?php echo $row['created_at']; ?></td>
                    <td><?php echo $row['view_count']; ?></td>
                </tr>
            <?php endwhile; ?>
        <?php else: ?>
            <tr>
                <td colspan="5">게시글이 없습니다.</td>
            </tr>
        <?php endif; ?>
        </tbody>
    </table>
    <div>
        <form action="board.php" method="get" class="mb-4">
            <div class="row">
                <div class="col-md-2">
                    <select name="search_option" class="form-select">
                        <option value="title" <?php echo ($search_option == 'title') ? 'selected' : ''; ?>>제목</option>
                        <option value="content" <?php echo ($search_option == 'content') ? 'selected' : ''; ?>>내용</option>
                        <option value="title, content" <?php echo ($search_option == 'title, content') ? 'selected' : ''; ?>>제목 + 내용</option>
                    </select>
                </div>
                <div class="col-md-8">
                    <input type="text" name="search_term" class="form-control" placeholder="검색어" value="<?php echo htmlspecialchars($search_term); ?>">
                </div>
                <div class="col-md-2">
                    <button type="submit" class="btn btn-primary w-100">검색</button>
                </div>
            </div>
        </form>
    </div>

    <div>
        <?php if (isset($_SESSION['username'])): ?>
            <form action="write.php" method="get">
                <button type="submit" class="btn btn-primary">새 글 작성하기</button>
            </form>
        <?php endif; ?>
    </div>
</div>




</body>
</html>

<?php
// 데이터베이스 연결 종료
$conn->close();
?>

 

php에서

// 검색 기능 구현
$search_option = isset($_GET['search_option']) ? $_GET['search_option'] : 'title';
$search_term = isset($_GET['search_term']) ? $_GET['search_term'] : '';

// 검색 조건에 따라 SQL 쿼리 설정
if ($search_term) {
    if ($search_option == 'title, content') {
        // 제목과 내용 모두에서 검색
        $sql = "SELECT * FROM posts WHERE title LIKE '%$search_term%' OR content LIKE '%$search_term%' ORDER BY created_at DESC";
    } else {
        // 단일 조건에 대해 검색
        $sql = "SELECT * FROM posts WHERE $search_option LIKE '%$search_term%' ORDER BY created_at DESC";
    }
} else {
    // 검색어가 없으면 모든 글을 가져옴
    $sql = "SELECT * FROM posts ORDER BY created_at DESC";
}
$result = $conn->query($sql);
?>

이 부분을 추가했다.

search_term 옵션을 만든 다음에, 

각각에 대해서 sql 문을 작성하고, 그것을 실행해서 나온 결과를 리턴한다.

그리고 맨 밑에

<form action="board.php" method="get" class="mb-4">
            <div class="row">
                <div class="col-md-2">
                    <select name="search_option" class="form-select">
                        <option value="title" <?php echo ($search_option == 'title') ? 'selected' : ''; ?>>제목</option>
                        <option value="content" <?php echo ($search_option == 'content') ? 'selected' : ''; ?>>내용</option>
                        <option value="title, content" <?php echo ($search_option == 'title, content') ? 'selected' : ''; ?>>제목 + 내용</option>
                    </select>
                </div>
                <div class="col-md-8">
                    <input type="text" name="search_term" class="form-control" placeholder="검색어" value="<?php echo htmlspecialchars($search_term); ?>">
                </div>
                <div class="col-md-2">
                    <button type="submit" class="btn btn-primary w-100">검색</button>
                </div>
            </div>
        </form>

이렇게 했는데, option 선택할 수 있게 한다.

실행하면

이렇게 뜬다. 저기다가 제목 부분에 2라고 치면

2가 있는 것만 가져온다. 잘 성공한 것이다.

 

 

 

 

서버에다가 올리기

사실, 이 부분 작성하면서 했어야했는데 그냥 무턱대로 끝내버려서 나도 기억이 잘 안 난다;

그래서 했던 것을 되짚어보면..

 sudo apt install php-mysqli
 sudo apt install php libapache2-mod-php

설치해주고, mysql 설정해주고...

/etc/apache2/

가서 apache2.conf에서 문서 루트 설정해주고

sites-available 가서 작업 루트 설정해주고...

 1721  sudo chmod +x /home /home/ubuntu /home/ubuntu/php
 1722  sudo chown -R www-data:www-data /home/ubuntu/php
 1723  sudo systemctl restart apache2

이러니 끝났다.

 

 

실제 서버에도 잘 올라갔다.

 

 

 

에필로그

문제가 하나 터졌는데 귀찮아서 안 바꿀란다...

파일 첨부한 거...

파일 _ 시간으로 해놨더니 확장자가 꺠진다

ㅋㅋ

아..

 

아이디 중복 검사, 비밀번호 해쉬, SQL인젝션 방지, 세션 쿠키 만료시간 설정, 게시판 페이징

이정도만 추가적으로하면 되긴 하겠지만 목표는 완수해서 이정도에서 마무리하겠다

728x90
반응형