프롤로그
거의 다 됐다.
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인젝션 방지, 세션 쿠키 만료시간 설정, 게시판 페이징
이정도만 추가적으로하면 되긴 하겠지만 목표는 완수해서 이정도에서 마무리하겠다
'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 |