배너만 만들어두고 여태껏 놔두기만 했던 문의게시판을 만들어보겠습니다. 이제 웹 개발 프로젝트도 막바지에 다가서고 있습니다.
메인 페이지에서는 이 배너를 누르면 문의게시판으로 이동합니다
하지만 이 게시판은 비회원도 이용할 수 있어야 하므로 첫 페이지 오른쪽 상단에도 문의 게시판 버튼을 만들어뒀습니다.
<a class="nav-link" href="./qna_board.php" style="float:right;">문의 게시판</a>
전체적인 틀은 자유게시판과 동일하지만 글들을 따로 관리하기 위해 DB에 qna_board라는 새 테이블을 만들어주겠습니다.
게시판에서 사용하는 DB 파일과 비슷한 컬럼과 타입으로 만들거라 board 테이블을 확인해보겠습니다. 총 9개의 컬럼에 number를 key로 사용하고 auto_increment 설정이 되어있습니다.
좋아요 기능과 조회수기능은 문의 게시판에 굳이 필요없을 것 같으니 제거하겠습니다.
그럼 phpmyadmin 으로 접속해 qna_board 테이블을 만들어 주겠습니다.
컬럼은 총 7개입니다. 데이터정렬방식과 NULL check, 인덱스 설정까지 해줍니다
설정이 끝났으면 저장을 눌러줍니다.
웹 페이지에서 보겠습니다. 조회수와 좋아요 기능을 지우고 4개의 항목만 나타나고 있습니다.
이제 본격적인 셋팅을 해보겠습니다
웹의 기본인 CRUD 기능을 구현하기 위해
총 8개의 파일을 만들어줍니다. ( qna_board.php 포함해서 )
삭제버튼을 누르면 삭제를 담당할 qna_delete.php
수정하는 qna_modify.php와 실제 수정 쿼리문을 실행할 qna_modify_proc.php
게시판 내용을 읽을 qna_read.php
그리고 검색했을 때 보여줄 qna_search.php
그다음 글 작성시 창을 띄울 qna_write.php와 실제 작성 쿼리문을 실행할 qna_write_proc.php
( 여기 코드 공개 )
qna_board.php
<!DOCTYPE html>
<?php
if(isset($_GET['ord_ca'])){
$ord_ca = $_GET['ord_ca'];
} else {
//정렬을 안했을 때
$ord_ca = 'number';
}
$con = mysqli_connect('localhost','root','1234','test');
if(isset($ord_ca)){
$query = "SELECT * FROM qna_board order by $ord_ca";
} else {
$query = "SELECT * FROM qna_board";
}
$result = $con->query($query);
?>
<style>
#page_num{
font-size: 14px;
margin:0 auto;
text-align:center;
}
#page_num ul{
text-align:center;
}
#page_num ul li {
margin-left: 10px;
display:inline-block;
}
.fo_re {
font-weight: bold;
color:red;
}
.space {
float: right;
}
.table thead th{
text-align: center;
}
.table tbody tr{
text-align: center;
}
.container{
display: inline-block;
margin: 0 auto;
text-align: center;
}
.date {
text-align: center;
}
</style>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
<?php
//상단 탭
require('./nav.html');
?>
<br>
<h1>문의 게시판</h1>
<HR>
<!--날짜 지정 검색 구현/3가지 태그를 나열하기 위해 table 태그 사용-->
<tr>
<th style="width:40%;">문의사항이 있으시다면 여기에 남겨주세요!
<p>
<!-- <form action="" method="GET" id="ord_ca" name="frm">
<select name="ord_ca">
<option value="none">정렬 기준</option>
<option value="date">날짜 순</option>
<option value="hit">조회 순</option>
<option value="thumbup">추천 수</option>
</select>
<input type="submit" value="정렬"/>
</form> -->
</th>
<th>
<a href="./qna_write.php"><button type="button" style="float:right;"class="btn btn-outline-success">글쓰기</button></a>
</th>
</tr>
<table class="table">
<thead>
<tr>
<th width="70">번호</th>
<th width="300">제목</th>
<th width="130">글쓴이</th>
<th width="120">작성일</th>
</tr>
</thead>
<!-- 페이징 -->
<?php
if(isset($_GET['page'])){
$page = $_GET['page'];
} else {
$page = 1;
}
$row_num = mysqli_num_rows($result); //게시판 총 개수
$list = 5; //한 페이지에 보여줄 개수
$block_ct = 5; //블록당 보여줄 페이지 개수
$block_num = ceil($page/$block_ct); //현재 페이지 블록 구하기
$block_start = (($block_num-1)* $block_ct)+1; //블록의 시작번호
$block_end= $block_start + $block_ct -1; //블록 마지막 번호
$total_page = ceil($row_num/$list); //페이징한 페이지 수 구하기
if($block_end >$total_page){
$block_end = $total_page;
} //만약 블록의 마지막 번호가 페이지수보다 많다면 마지막번호는 페이지 수
$total_block = ceil($total_page/$block_ct); //블럭 총 개수
$start_num = ($page-1)*$list; //시작번호 (page -1)에서 $list 를 곱한다.
//GET으로 받은 정렬 값이 있다면 그걸로 정렬, 없으면 number순 정렬
//근데 페이징 할때마다 $ord_ca가 사라짐
$query2 = "SELECT * FROM qna_board order by $ord_ca desc limit $start_num,$list";
$result2 = $con ->query($query2);
while($board = $result2->fetch_array()){
$title = $board['title']; //게시글 제목
$number = $board['number']; //게시글 번호
if(isset($board['name'])){
$name = $board['name']; //작성자
} else {
$name = "익명";
}
$date = $board['date']; //작성 날짜
// $thumbup = $board['thumbup']; //좋아요 수
// $hit = $board['hit']; //조회수
if(strlen($title)>30){
$title = str_replace($board['title'],mb_substr($board['title'],0,30,"utf-8")."...",$board['title']);
}
//title이 30글자가 넘어가면 ...표시
?>
<tbody>
<tr>
<td width="70"><?php echo $number; ?></td>
<td width="300"><a href="./qna_read.php?number=<?php echo $board['number'];?>"><?php echo $title;?></td>
<td width="130"><?php echo $name; ?></td>
<td width="120"><?php echo $date; ?></td>
</tr>
</tbody>
<?php
}
?>
</table>
<div id="page_num">
<ul>
<?php
if($page <= 1)
{ //만약 page가 1보다 크거나 같다면
echo "<li class='fo_re'>처음</li>"; //처음이라는 글자에 빨간색 표시
} else {
echo "<li><a href='?page=1&ord_ca=$ord_ca'>처음</a></li>"; //아니라면 처음글자에 1번페이지로 갈 수 있게 링크
}
if($page <= 1){
} else {
$pre = $page -1;
echo "<li><a href='?page=$pre&ord_ca=$ord_ca'>이전</a></li>"; //이전글자에 pre변수를 링크한다. 이러면 이전버튼을 누를때마다 현재 페이지에서 -1하게 된다.
}
for($i=$block_start; $i<=$block_end; $i++){
//for문 반복문을 사용하여, 초기값을 블록의 시작번호를 조건으로 블록시작번호가 마지박블록보다 작거나 같을 때까지 $i를 반복시킨다
if($page == $i){ //만약 page가 $i와 같다면
echo "<li class='fo_re'>[$i]</li>"; //현재 페이지에 해당하는 번호에 굵은 빨간색을 적용한다
}else{
echo "<li><a href='?page=$i&ord_ca=$ord_ca'>[$i]</a></li>"; //아니라면 $i
}
}
if($block_num >= $total_block){ //만약 현재 블록이 블록 총개수보다 크거나 같다면 빈 값
}else{
$next = $page + 1; //next변수에 page + 1을 해준다.
echo "<li><a href='?page=$next&ord_ca=$ord_ca'>다음</a></li>"; //다음글자에 next변수를 링크한다. 현재 4페이지에 있다면 +1하여 5페이지로 이동하게 된다.
}
if($page >= $total_page){ //만약 page가 페이지수보다 크거나 같다면
echo "<li class='fo_re'>마지막</li>"; //마지막 글자에 긁은 빨간색을 적용한다.
}else{
echo "<li><a href='?page=$total_page&ord_ca=$ord_ca'>마지막</a></li>"; //아니라면 마지막글자에 total_page를 링크한다.
}
?>
</ul>
<br><Br>
<div class="input-group mb-3 container">
<!-- 검색 항목 form 태그 -->
<form action="qna_search.php" method="GET" style="margin: auto;">
<select name="category">
<option value="title">제목</option>
<option value="name">글쓴이</option>
<option value="content">내용</option>
</select>
<input type="text" name="search" placeholder="검색할 게시글 입력" required="required">
<button class="btn btn-outline-secondary" type="submit" id="button-addon2">검색</button>
<div class="date">
<br>
<div>시작일: <input type="date" name="pre_date" id="pre_date" data-placeholder="시작 날짜"/>
종료일: <input type="date" name="end_date" id="end_date" /></div>
</form>
</div>
</div>
</body>
</html>
글 작성
그럼 이제 글 작성을 해보겠습니다
qna_write.php
<?php
//비회원도 이용가능해야하므로 세션없어도 이용가능해야함
session_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>문의 게시판 글쓰기</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
<?php
require('./nav.html');
?>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
<article class="article">
<BR>
<h1>문의 게시판 글쓰기</h1>
<HR>
<div id="boardwrite">
<form action="./qna_write_proc.php" method="POST" enctype="multipart/form-data">
<table id="boardwrite">
<caption class="readHIde">문의게시판 글쓰기</caption>
<tbody>
<tr>
<th scope="row"><label for="bTitle">제목</label></th>
<td class="title"><input type="text" name="bTitle" id="bTitle"></td>
</tr>
<tr>
<th scope="row"><label for="bContent">내용</label></th>
<td class="content"><textarea name="bContent" id="bContent"></textarea></td>
</tr>
<tr>
<th scope="row"><label for="bPassword">비밀번호</label></th>
<td class="password"><input type="text" name="bPassword" id="bPassword"></td>
</tr>
</tbody>
<div class="btnSEt">
<button style="background-color:pink" type="submit"><div>작성</div></button>
</div>
<input type="file" name="board_file" />
</form>
<a href="qna_board.php" class="btnLIst btn"><div style="border:2px solid grey;">목록</div></a>
</div>
</article>
</body>
</html>
qna_write_proc.php
<?php
//세션 시작
session_start();
//작성된 값을 받아서 변수로 저장함
$name = $_SESSION['id'];
if(isset($_SESSION['id'])){
$name = $_SESSION['id'];
} else {
$name = "익명";
}
$bPassword = $_POST['bPassword'];
$bTitle = $_POST['bTitle'];
$date = date('Y-m-d');
$bContent = $_POST['bContent'];
//파일 관련 변수
if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_FILES['board_file'])){
// $filesize=$_FILES['board_file']['size'];
// $file_error=$_FILES['board_file']['error'];
$tmpfile = $_FILES['board_file']['tmp_name'];
$origin_filename = $_FILES['board_file']['name'];
$allowed_mime_types =['image/jpeg','image/png','image/gif','application/zip','application/x-hwp','application/msword','application/pdf']; //mime허락된 형식
$filename = iconv("UTF-8","EUC-KR",$_FILES['board_file']['name']);
$timestamp = time();
$new_filename = $timestamp.'_'.$filename;
$file_mime_type = mime_content_type($tmpfile);
// if(in_array($file_mime_type, $allowed_mime_types)){
//파일 저장 경로
$upload_path = './upload/'.$new_filename;
if(move_uploaded_file($tmpfile,$upload_path)){
$_SESSION['write_error'] = '파일 업로드 success!';
} else {
$_SESSION['write_error'] = '파일 업로드 Fail ㅜㅜ';
}
};
//데이터베이스에 저장할 쿼리 엶
$con = mysqli_connect('localhost','root','1234','test');
if(!empty($origin_filename)){
$query = "INSERT INTO qna_board (title, content, date, name,password,file) VALUES ('$bTitle','$bContent','$date','$name','$bPassword','$new_filename')";
} else {
$query = "INSERT INTO qna_board (title, content, date, name,password,file) VALUES ('$bTitle','$bContent','$date','$name','$bPassword',NULL)";
}
if ($con->query($query)){
echo "<h1>글쓰기 완료</h1>";
echo "<p>작성한 글이 성공적으로 등록되었습니다.</p>";
echo "<a href='qna_board.php'><button>목록으로 돌아가기</button></a>";
} else {
echo "Error:".$sql."<br>".mysqli_error($con);
echo "<a href='qna_write.php'><button>돌아가기</button></a>";
}
?>
간단한 문의인 것처럼 글 작성을 하고 작성 버튼을 누르니 게시판 리스트에 잘 등록된 것을 볼 수 있습니다
읽기
qna_read.php
<?php
//세션 시작
session_start();
if(isset($_SESSION['id'])){
$login_id = $_SESSION['id'];
} else {
$login_id = "익명";
}
//클릭할 때 number GET으로 가져옴
$bno = $_GET['number'];
//게시판 DB 연결
$con = mysqli_connect('localhost','root','1234','test');
//SQL Injection 대응
$boardlike_id = mysqli_real_escape_string($con,filter_var(strip_tags($bno), FILTER_SANITIZE_SPECIAL_CHARS));
//게시판 내용 보여주기
$query = "SELECT * FROM qna_board WHERE number='".$bno."'";
$result = $con->query($query);
$board = $result->fetch_array();
//문의게시판에는 조회수 기능 필요 없음
// $hit = $board['hit'];
// $hit = $hit + 1;
// $hit_query = "UPDATE board SET hit = '".$hit."' WHERE number ='".$bno."'";
// $hit_result = $con->query($hit_query);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>문의 게시판</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
<?php
require('./nav.html');
?>
<!-- 게시글 불러오기 -->
<h2><?php echo $board['title']; ?></h2><HR>
<div>작성자 :<?php echo $board['name']; ?>
<?php echo " 작성날짜 : ".$board['date']; ?></div>
<!-- 기준선 -->
<HR>
<?php
$filename = explode('_', $board['file'])[1]; //타임스탬프를 제거 후 파일명만 분리
$download_url = 'download_proc.php?filename='.$board['file'];
echo '<p>파일 : <a href="'.$download_url.'">'.$filename.'</a></p>';
?>
<textarea style="width:100%; height:15rem;" readonly><?php echo $board['content']; ?></textarea>
<br><Br>
<a href="./qna_modify.php?number=<?php echo $board['number'];?>"><button class="btn btn-secondary">수정</button></a>
<a href="./qna_delete.php?number=<?php echo $board['number'];?>" onclick="return confirm('정말로 삭제하시겠습니까? 삭제 후에는 되돌릴 수 없습니다.')"><button class="btn btn-secondary">삭제</button></a>
<a href="./qna_board.php"><button class="btn btn-secondary">목록</button></a>
<p>
<?php
if(isset($_SESSION['write_error'])){
echo $_SESSION['write_error'];
unset($_SESSION['write_error']);
}
?>
</body>
</html>
클릭하면? read도 잘 됩니다
검색
검색은 잘될까요?
qna_search.php
<!DOCTYPE html>
<?php
session_start();
$con = mysqli_connect('localhost','root','1234','test');
//get으로 카테고리와 검색값을 받음
$category = $_GET['category'];
$search_title= $_GET['search'];
if(isset($_GET['ord_ca'])){
$ord_ca = $_GET['ord_ca'];
} else {
//정렬을 안했을 때
$ord_ca = 'number';
}
//get으로 날짜 지정값을 받음
$pre_date = $_GET['pre_date'];
$end_date = $_GET['end_date'];
//GET으로 page받음
if(isset($_GET['page'])){
$page = $_GET['page'];
} else {
$page = 1;
}
if($category=='title'){
$catname = "제목";
} else if ($category=="name"){
$catname = "작성자";
} else if ($category=="content"){
$catname = '내용';
}
if($pre_date&&$end_date){
$query = "SELECT * FROM qna_board WHERE $category LIKE '%$search_title%' AND date BETWEEN '$pre_date' and '$end_date' ORDER BY $ord_ca DESC" ;
} else {
$query = "SELECT * FROM qna_board WHERE $category like '%$search_title%' order by $ord_ca desc";
}
$result = $con->query($query);
?>
<style>
#page_num{
font-size: 14px;
margin:0 auto;
text-align:center;
}
#page_num ul{
text-align:center;
}
#page_num ul li {
margin-left: 10px;
display:inline-block;
}
.fo_re {
font-weight: bold;
color:red;
}
.space {
float: right;
}
.table thead th{
text-align: center;
}
.table tbody tr{
text-align: center;
}
.container{
display: inline-block;
margin: 0 auto;
text-align: center;
}
.date {
text-align: center;
}
</style>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
<?php
require('./nav.html');
?>
<br>
<h1>문의 게시판 검색결과</h1>
<hr>
<th><?php echo $catname." 내에서 ".$_GET['search']." 검색결과 표시" ?>
<p>
</th>
<th>
<a href="./qna_write.php"><button itype="button" class="btn btn-outline-success space">글쓰기</button></a>
</th>
<table class="table">
<thead>
<tr>
<th width="70">번호</th>
<th width="300">제목</th>
<th width="130">글쓴이</th>
<th width="120">작성일</th>
</tr>
</thead>
<?php
$row_num = mysqli_num_rows($result); //게시판 총 개수
$list = 5; //한 페이지에 보여줄 개수
$block_ct = 5; //블록당 보여줄 페이지 개수
$block_num = ceil($page/$block_ct); //현재 페이지 블록 구하기
$block_start = (($block_num-1)* $block_ct)+1; //블록의 시작번호
$block_end= $block_start + $block_ct -1; //블록 마지막 번호
$total_page = ceil($row_num/$list); //페이징한 페이지 수 구하기
if($block_end >$total_page){
$block_end = $total_page;
} //만약 블록의 마지막 번호가 페이지수보다 많다면 마지막번호는 페이지 수
$total_block = ceil($total_page/$block_ct); //블럭 총 개수
$start_num = ($page-1)*$list; //시작번호 (page -1)에서 $list 를 곱한다.
if($pre_date&&$end_date){
$query3 = "SELECT * FROM qna_board WHERE $category LIKE '%$search_title%' AND date BETWEEN '$pre_date' AND '$end_date' order by $ord_ca DESC limit $start_num,$list";
} else {
$query3 = "SELECT * FROM qna_board WHERE $category like '%$search_title%' order by $ord_ca desc limit $start_num,$list";
}
$result3 = $con ->query($query3);
while($s_board = $result3->fetch_array()){
$title = $s_board['title'];
$number = $s_board['number'];
$name = $s_board['name'];
$date = $s_board['date'];
if(strlen($title)>30){
$title = str_replace($s_board['title'],mb_substr($s_board['title'],0,30,"utf-8")."...",$s_board['title']);
}
//title이 30글자가 넘어가면 ...표시
?>
<tbody>
<tr>
<td width="70"><?php echo $number; ?></td>
<td width="300"><a href="./qna_read.php?number=<?php echo $s_board['number'];?>"><?php echo $title;?></td>
<td width="130"><?php echo $name; ?></td>
<td width="120"><?php echo $date; ?></td>
</tr>
</tbody>
<?php
}
?>
</table>
<div id="page_num">
<ul>
<?php
if($page <= 1)
{ //만약 page가 1보다 크거나 같다면
echo "<li class='fo_re'>처음</li>"; //처음이라는 글자에 빨간색 표시
} else {
echo "<li><a href='?page=1&ord_ca=$ord_ca'>처음</a></li>"; //아니라면 처음글자에 1번페이지로 갈 수 있게 링크
}
if($page <= 1){
} else {
$pre = $page -1;
echo "<li><a href='?category=$category&search=$search_title&page=$pre&pre_date=$pre_date&end_date=$end_date&ord_ca=$ord_ca'>이전</a></li>"; //이전글자에 pre변수를 링크한다. 이러면 이전버튼을 누를때마다 현재 페이지에서 -1하게 된다.
}
for($i=$block_start; $i<=$block_end; $i++){
//for문 반복문을 사용하여, 초기값을 블록의 시작번호를 조건으로 블록시작번호가 마지박블록보다 작거나 같을 때까지 $i를 반복시킨다
if($page == $i){ //만약 page가 $i와 같다면
echo "<li class='fo_re'>[$i]</li>"; //현재 페이지에 해당하는 번호에 굵은 빨간색을 적용한다
}else{
echo "<li><a href='?category=$category&search=$search_title&page=$i&pre_date=$pre_date&end_date=$end_date&ord_ca=$ord_ca'>[$i]</a></li>"; //아니라면 $i
}
}
if($block_num >= $total_block){ //만약 현재 블록이 블록 총개수보다 크거나 같다면 빈 값
}else{
$next = $page + 1; //next변수에 page + 1을 해준다.
echo "<li><a href='?category=$category&search=$search_title&page=$next&pre_date=$pre_date&end_date=$end_date&ord_ca=$ord_ca'>다음</a></li>"; //다음글자에 next변수를 링크한다. 현재 4페이지에 있다면 +1하여 5페이지로 이동하게 된다.
}
if($page >= $total_page){ //만약 page가 페이지수보다 크거나 같다면
echo "<li class='fo_re'>마지막</li>"; //마지막 글자에 긁은 빨간색을 적용한다.
}else{
echo "<li><a href='?category=$category&search=$search_title&page=$total_page&pre_date=$pre_date&end_date=$end_date&ord_ca=$ord_ca'>마지막</a></li>"; //아니라면 마지막글자에 total_page를 링크한다.
}
?>
</ul>
<br><Br>
<div class="input-group mb-3 container">
<form action="qna_search.php" method="GET" style="margin: auto;">
<select name="category">
<option value="title">제목</option>
<option value="name">글쓴이</option>
<option value="content">내용</option>
</select>
<input type="text" name="search" placeholder="검색할 게시글 입력" required="required">
<button class="btn btn-outline-secondary" type="submit" id="button-addon2">검색</button>
<br>
<div>시작일: <input type="date" name="pre_date" id="pre_date" data-placeholder="시작 날짜"/>
종료일: <input type="date" name="end_date" id="end_date" /></div>
</form>
</div>
</body>
</html>
제목 옵션을 주고 '문의'라고 검색하니 방금 작성한 문의글이 잘 검색되었습니다.
수정
다음은 수정 기능입니다
qna_modify.php
<?php
session_start();
//클릭한 게시글의 number를 가져옴
$bno = $_GET['number'];
//데이터베이스 연결 기본 셋팅
$con = mysqli_connect('localhost','root','1234','test');
$query = "SELECT * FROM qna_board WHERE number='$bno';";
$result = $con->query($query);
$board = $result->fetch_array();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>문의 게시판 글쓰기</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
<?php
require('nav.html');
?>
<h1>문의 게시판 글수정</h1>
<hr>
<div id="boardwrite">
<h6>문의게시판 글수정</h6>
<br>
<form action="./qna_modify_proc.php?number=<?php echo $bno; ?>" method="POST">
<table>
<thead>
<tr>
<th>비밀번호</th>
<td class="password"><input type="text" name="bPassword" id="bPassword"></td>
</tr>
<tr>
<th>제목</th>
<td class="title"><textarea type="text" name="bTitle" id="bTitle" maxlength="100"><?php echo $board['title']; ?></textarea>
</td>
</tr>
<tr>
<th>내용</th>
<td class="content"><textarea name="bContent" id="bContent" maxlength="100"><?php echo $board['content']; ?></textarea></td>
</tr>
</thead>
</table>
<br>
<div class="btnSEt">
<button type="submit" class="btnSubmit btn">수정 완료</button>
<a href="./qna_board.php" class="btnLIst btn">목록</a></div>
</form>
</body>
</html>
qna_modify_proc.php
<?php
session_start();
$con = mysqli_connect('localhost','root','1234','test');
//이 부분은 url로 전달받음
$bno = $_GET['number'];
//이건 로그인한 이후로 원래 있는거
if(isset($_SESSION['id'])){
$username = $_SESSION['id'];
} else {
$username = "익명";
}
//post로 전달받은 부분
$userpw = $_POST['bPassword'];
$title = $_POST['bTitle'];
$content = $_POST['bContent'];
//쿼리문 실행
$query = "UPDATE qna_board SET name='$username',password='$userpw',title='$title',content='$content' WHERE number='$bno'";
$result = $con->query($query);
echo "수정이 완료되었습니다!<br><br>";
echo "<a href='qna_board.php'><button>게시판으로 돌아가기</button></a>";
?>
완료 후 클릭해 게시글을 읽어보니 수정사항이 잘 반영되었습니다.
삭제
이젠 삭제를 테스트 해보겠습니다
qna_delete.php
<?php
session_start();
$con = mysqli_connect('localhost','root','1234','test');
//이 부분은 url로 전달받음
$bno = $_GET['number'];
//삭제 쿼리문 실행
$query = "DELETE from qna_board WHERE number='$bno'";
$result = $con->query($query);
echo "삭제가 완료되었습니다!<br><br>";
echo "<a href='qna_board.php'><button>게시판으로 돌아가기</button></a>";
?>
버튼을 누르면 정말 취소할 건지 확인을 해주고
확인을 누르면 삭제가 되었다는 창이 나옵니다
그리고 다시 돌아가면 정말 삭제가 잘 되었네요!
자 이렇게 문의 게시판을 구현해보았는데요
만들어야할 파일과 군데군데 손봐야할 곳은 좀 더 있지만
기존에 만들었던 게시판의 틀을 거의 이용해서 난이도는 어렵지 않았던 것 같습니다.
그런데 현재는 세션이 없어도 main.php로 연결될 위험이 있기 때문에 비회원이 이용해야할 때 문의 게시판만 이용하도록 좀 더 손봐야할 것 같습니다.
봐주셔서 감사합니다
'개발 > 웹 개발' 카테고리의 다른 글
Swagger로 문서 API 자동화 (0) | 2023.08.10 |
---|---|
[14주차] 문의 게시판 구현 #2 - 비밀번호 인증 (0) | 2023.06.27 |
[14주차] 마이 페이지 구현 #3 - 비밀번호 변경 기능 (0) | 2023.06.24 |
[13주차] 마이 페이지 구현 #2 - 개인 정보 수정 기능 구현 (0) | 2023.06.22 |
[13주차] 마이 페이지 구현 #1 - 자신의 정보 확인 (0) | 2023.06.20 |