728x90
반응형
프롤로그
거의 다 됐다.
2024.12.22 - [KnockOn] - [3주차 TIL] KnockOn Bootcamp PHP 게시판 수정 및 삭제
여기서 게시판 수정 삭제를 했었고, 그 해당 코드는
https://github.com/Vak-kas/php/tree/board2
여기에 저장해두었다.
게시판 글 검색 기능 구현
이번 글은 굉장히 짧을 것이다. 왜냐면 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
반응형
'KnockOn' 카테고리의 다른 글
[KnockOn] 1.1 SQL Injection - Login Write-up (0) | 2024.12.27 |
---|---|
[KnockOn] SQL Injection의 개념과 Union select SQL Injection의 수행과정 (0) | 2024.12.25 |
[3주차 TIL] KnockOn Bootcamp PHP 게시판 수정 및 삭제 (1) | 2024.12.22 |
[3주차 TIL] KnockOn Bootcamp PHP 게시판 생성 및 조회 (0) | 2024.12.22 |
[3주차 TIL] KnockOn Bootcamp PHP와 MySQL 연결, 회원가입과 로그인 (0) | 2024.12.22 |